首页 > 其他分享 >使用SheetJs实现在线预览Excel(保留单元格格式信息)

使用SheetJs实现在线预览Excel(保留单元格格式信息)

时间:2023-08-31 22:33:05浏览次数:36  
标签:cellStyle row 单元格 Excel SheetJs var font col styleAttr

一、寻找合适的在线预览Excel的js库

经过百度各种搜索,加上ChatGpt推荐,决定用SheetJs实现在线预览Excel。下面是SheetJs的官网介绍:

SheetJS 电子表格简化 读取、编辑和导出电子表格 适用于网络浏览器和服务器 Office 365 受到 Microsoft 信任   SheetJS 软件为业务提供动力 谷歌、亚马逊、Facebook 服务 美国政府网站 超过 90% 的标准普尔 500 强公司的团队   专业版 强大的功能 广泛的兼容性 优先支持   SheetJS 专业版 常见用例 可靠的数据导入 专业报告 编辑电子表格文件   现场演示 社区版 开源 需要归属 社区援助   文档     二、基础版实现代码  
<script>
(async() => {
  /* replace with the URL of the file */
  const URL_TO_DOWNLOAD = "https://sheetjs.com/pres.numbers";
  const ab = await (await fetch(URL_TO_DOWNLOAD)).arrayBuffer();

  /* Parse file and get first worksheet */
  const wb = XLSX.read(ab);
  const wsname = wb.SheetNames[0];
  const ws = wb.Sheets[wsname];

  /* Generate HTML */
  var output = document.getElementById("TableContainer");
  output.innerHTML = XLSX.utils.sheet_to_html(ws);
})();
</script>

 

 

三、增强版实现代码,支持单元格格式等

由于基础实现丢失了很多关键格式信息,比如字体大小、背景色、对齐方式、批注等。于是请教ChatGpt帮忙写代码。下面是ChatGpt写出来的代码,正确与否待验证

<!DOCTYPE html>
<html>
<head>
  <title>Excel Online Preview</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.9/xlsx.full.min.js"></script>
  <style>
    /* 根据需要设置单元格样式 */
    .cell {
      padding: 5px;
      border: 1px solid #ccc;
      font-family: Arial, sans-serif;
    }
  </style>
</head>
<body>
  <button id="loadExcelButton">加载Excel</button>
  <div id="excelPreview"></div>

  <script>
    document.getElementById('loadExcelButton').addEventListener('click', function() {
      fetchExcelData();
    });

    function fetchExcelData() {
      fetch('URL_OF_YOUR_BACKEND_API')
        .then(response => response.arrayBuffer())
        .then(data => {
          var workbook = XLSX.read(new Uint8Array(data), { type: 'array' });
          var sheetName = workbook.SheetNames[0];
          var sheet = workbook.Sheets[sheetName];
          var cellData = XLSX.utils.sheet_to_json(sheet, { header: 1 });

          var htmlTable = '<table>';
          for (var row = 0; row < cellData.length; row++) {
            htmlTable += '<tr>';
            for (var col = 0; col < cellData[row].length; col++) {
              var cellValue = cellData[row][col];
              var cellRef = XLSX.utils.encode_cell({ r: row, c: col });
              var cell = sheet[cellRef];
              var cellStyle = cell ? cell.s : {};
              var cellStyleAttr = 'style="' + getCellStyle(cellStyle) + '"';
              var mergeAttr = getMergeAttributes(sheet, row, col);
              var comment = getCellComment(cell);

              var cellHtml = '<td class="cell" ' + cellStyleAttr + ' ' + mergeAttr + '" title="' + comment + '">' + cellValue + '</td>';
              htmlTable += cellHtml;
            }
            htmlTable += '</tr>';
          }
          htmlTable += '</table>';

          document.getElementById('excelPreview').innerHTML = htmlTable;
        })
        .catch(error => {
          console.error('Error fetching Excel data:', error);
        });
    }

    function getCellStyle(cellStyle) {
      var styleAttr = '';
      if (cellStyle.font) {
        var font = cellStyle.font;
        if (font.bold) styleAttr += 'font-weight:bold;';
        if (font.italic) styleAttr += 'font-style:italic;';
        if (font.underline) styleAttr += 'text-decoration:underline;';
        if (font.strike) styleAttr += 'text-decoration:line-through;';
        if (font.color) styleAttr += 'color:' + font.color.rgb + ';';
        if (font.name) styleAttr += 'font-family:' + font.name + ';';
      }
      if (cellStyle.alignment) {
        var alignment = cellStyle.alignment;
        if (alignment.horizontal) styleAttr += 'text-align:' + alignment.horizontal + ';';
        if (alignment.vertical) styleAttr += 'vertical-align:' + alignment.vertical + ';';
      }
      if (cellStyle.fill) {
        var fill = cellStyle.fill;
        if (fill.patternType === 'solid' && fill.fgColor) {
          styleAttr += 'background-color:' + fill.fgColor.rgb + ';';
        }
      }
      return styleAttr;
    }

    function getMergeAttributes(sheet, row, col) {
      var mergeCells = sheet['!merges'] || [];
      for (var i = 0; i < mergeCells.length; i++) {
        var mergeRange = XLSX.utils.decode_range(mergeCells[i]);
        if (row >= mergeRange.s.r && row <= mergeRange.e.r && col >= mergeRange.s.c && col <= mergeRange.e.c) {
          return 'rowspan="' + (mergeRange.e.r - mergeRange.s.r + 1) + '" colspan="' + (mergeRange.e.c - mergeRange.s.c + 1) + '"';
        }
      }
      return '';
    }

    function getCellComment(cell) {
      if (cell && cell.c) {
        var comment = cell.c[0].t;
        return comment;
      }
      return '';
    }
  </script>
</body>
</html>

图片展示

发现一个代码高亮转成图片的网站:

https://10015.io/tools/code-to-image-converter?utm_source=appinn.com

标签:cellStyle,row,单元格,Excel,SheetJs,var,font,col,styleAttr
From: https://www.cnblogs.com/hdwang/p/17670534.html

相关文章

  • 有了Excel和PPT,为什么我们还需要数据可视化工具?
    在当今信息时代,数据扮演着越来越重要的角色,而数据的可视化呈现正是一种强大的工具,能够帮助我们更好地理解和利用这些数据。虽然Excel和PPT在处理数据方面有着不可否认的作用,但在处理大规模、复杂数据时,数据可视化工具的独特优势却愈发显现。第一,数据可视化工具能够将抽象的数据......
  • excel导出功能
    packagecom.infosec.ztpdp.policycenter.module.audit.controller;importjava.io.IOException;importjava.io.OutputStream;importjava.net.URLDecoder;importjava.text.SimpleDateFormat;importjava.util.HashMap;importjava.util.List;importjava.util.Map;......
  • 存储过程导出EXCEL
    请参考下面代码:--创建存储过程CREATEPROCEDUREExportToExcel@TableNameNVARCHAR(128)ASBEGIN--创建临时表来存储查询结果CREATETABLE#TempTable(IDINT,Column1NVARCHAR(50),Column2NVARCHAR(50),Column3NVARCHAR(50))--执行查询并将结果插入临时表INS......
  • pandas操作excel表格
    点击查看代码importpandasaspdfromtqdmimporttqdmfile1=r"files/1.xls"file2=r"files/2.xls"df_File1=pd.read_excel(file1,sheet_name='keyWord',keep_default_na=False)key_column=df_File1['key'].fillna('......
  • js前端excel导出带图片(亲测可用)
    1,js-table2excelnpm包有问题,导出后一片空白 2,改写一下js-table2excel/*eslint-disable*/letidTmr;constgetExplorer=()=>{letexplorer=window.navigator.userAgent;//ieif(explorer.indexOf("MSIE")>=0){return'ie';}......
  • 当某个excel工作簿的某个单元格的值发生变动时, 自动执行python某脚本, 如何实现?
    要实现当Excel工作簿中的某个单元格值发生变化时自动执行Python脚本,你可以考虑以下步骤:监视单元格变化:首先,你需要实现监视Excel工作簿中的特定单元格是否发生了变化。这可以通过使用VBA(VisualBasicforApplications)宏来实现。打开Excel工作簿,按下ALT+F11打开VBA编辑器,然后......
  • 通过pandas读取excel数据,很多数据开头带有'特殊字符,如何处理?
    大家好,我是皮皮。一、前言前几天在Python最强王者群【wen】问了一个Pandas数据处理的问题,一起来看看吧。请教问题:通过pandas读取excle数据,很多数据开头带有'特殊字符,我用replace或者strip()函数处理均无法处理。二、实现过程这里【瑜亮老师】也给了一个代码,如下所示:df.columns......
  • C#里面设置ListView单列(某个单元格的样式:颜色和字体等
    C#里面设置ListView单列(某个单元格的样式:颜色和字体等)。                ListViewItemlvi=newListViewItem((i+1).ToString());               lvi.UseItemStyleForSubItems=false;                ListViewItem.......
  • python 高效处理EXCEL对比
    #coding=utf-8importxlwingsasxwimportpandasaspdimporttime#记录打开表单开始时间start_open_time=time.time()#指定不显示地打开Excel,读取Excel文件app=xw.App(visible=False,add_book=False)wb=app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx')#......
  • Excelize 开源基础库 2.8.0 版本正式发布
    Excelize是Go语言编写的用于操作电子表格办公文档的开源基础库,基于ISO/IEC29500、ECMA-376国际标准。可以使用它来读取、写入由MicrosoftExcel、WPS、ApacheOpenOffice、LibreOffice等办公软件创建的电子表格文档。支持XLAM/XLSM/XLSX/XLTM/XLTX等多种文档格......