欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端本地文件獲取excel表格內(nèi)容并渲染在頁面的方法

 更新時(shí)間:2025年03月15日 08:41:47   作者:淇淇包.  
這篇文章主要介紹了前端本地文件獲取excel表格內(nèi)容并渲染在頁面的方法,主要利用SheetJS插件用于處理Excel文件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

插件:SheetJs ,如若想要了解更多,可參考官網(wǎng):SheetJS 中文網(wǎng)

效果圖:

方法1: XLSX.readFile(filename, opts)  讀取指定文件并生成 SheetJS 工作簿對(duì)象

如果表格內(nèi)容較少,體驗(yàn)較好

如果表格內(nèi)容很多,幾千行,則不推薦,數(shù)據(jù)量過大會(huì)導(dǎo)致頁面卡死,體驗(yàn)差

代碼:

<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>可在線展示Excel的js插件</title>
    <style>
        html,body {
      width: 100%;
      height: 100%;
      padding: 0;
      margin: 0;
    }
    .container {
      overflow: auto;
      width: 100%;
      height: 100%;
    }
    table {
      width: 100%;
      border-collapse: collapse;
    }
    th, td {
      border: 1px solid #ddd;
      padding: 8px;
    }
    th {
      background-color: #f2f2f2;
      text-align: left;
    }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
</head>
<body>
    <div class="container" id="container">

    </div>
    <script>
        var nContainer = document.getElementById('container');  
        var xlsx = new Plus.Xlsx(nContainer);
        xlsx.readFile('本地文件路徑');
    </script>
</body>
</html>

方法2:XLSX.read(data, opts) 解析文件數(shù)據(jù)并生成 SheetJS 工作簿對(duì)象

可獲取固定的數(shù)據(jù)格式,并處理懶加載方式,從而緩解數(shù)據(jù)量過大卡死現(xiàn)象

代碼:

<!DOCTYPE html>
<html lang="cn">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>可在線展示Excel的 js插件</title>
  <style>
    html,body {
      width: 100%;
      height: 100%;
      padding: 0;
      margin: 0;
    }
    .container {
      overflow: auto;
      width: 100%;
      height: 100%;
    }
    table {
      width: 100%;
      border-collapse: collapse;
    }
    th, td {
      border: 1px solid #ddd;
      padding: 8px;
    }
    th {
      background-color: #f2f2f2;
      text-align: left;
    }
  </style>
  <script type="text/javascript" src="/jquery-3.6.0.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
</head>
<body>
<div id="excel-data" class="container"></div>
<script type="text/javascript">
  const excelData = $('#excel-data');
  let allData = [];
  let loadedRows = 0;
  const pageSize = 50;

  let mergeInfo = {};
  let currentMergeCounts = {};
  async function loadStaticFile(filePath) {
    try {
      const response = await fetch(filePath);
      const blob = await response.blob();
      const file = new File([blob], '職業(yè)類別表.xls', { type: blob.type });
      const reader = new FileReader();
      reader.onload = (e) => {
        const data = new Uint8Array(e.target.result);
        const workbook = XLSX.read(data, { type: 'array' });

        // 只讀取第一個(gè)工作表
        const firstSheetName = workbook.SheetNames[0];
        const worksheet = workbook.Sheets[firstSheetName];
        allData = XLSX.utils.sheet_to_json(worksheet);

        // 初始化表格和合并信息
        initializeTable();
        calculateMergeInfo(allData);
        loadMoreRows();

        // 監(jiān)聽滾動(dòng)事件,在接近底部時(shí)加載更多數(shù)據(jù)
        excelData.on('scroll', handleScroll);
      };

      reader.readAsArrayBuffer(file);
    } catch (error) {
      console.error('加載文件失敗:', error);
    }
  }
  loadStaticFile('/view/zhiyefenlei01_new.xls');

  function initializeTable() {
    let jobHtml = "<table border='1' cellpadding='5' cellspacing='0'>";
    // 構(gòu)建表頭
    const headers = ['大分類', '中分類', '小分類', '代碼', '細(xì)類', '職業(yè)類別'];
    jobHtml += `<thead><tr>${headers.map(h => `<th>${h}</th>`).join('')}</tr></thead>`;
    jobHtml += "<tbody>";
    excelData.html(jobHtml + "</tbody></table>");
  }

  function calculateMergeInfo(data) {
    mergeInfo = {};
    currentMergeCounts = {};
    data.forEach((row, rowIndex) => {
      const headers = ['大分類', '中分類', '小分類', '代碼', '細(xì)類', '職業(yè)類別'];
      headers.forEach(header => {
        if (!mergeInfo[header]) {
          mergeInfo[header] = [];
          currentMergeCounts[header] = 0;
        }

        // 如果當(dāng)前行缺少該字段,則認(rèn)為它是前一行的延續(xù)
        if (row[header] === undefined || row[header] === '') {
          currentMergeCounts[header]++;
        } else {
          // 如果有未處理的合并項(xiàng),更新之前的 rowspan
          if (currentMergeCounts[header] > 0) {
            const lastIndex = rowIndex - currentMergeCounts[header] - 1;
            mergeInfo[header][lastIndex] = currentMergeCounts[header] + 1;
            currentMergeCounts[header] = 0;
          }
          mergeInfo[header].push(0);
        }
      });

      // 處理最后一組合并項(xiàng)
      if (rowIndex === data.length - 1) {
        Object.keys(currentMergeCounts).forEach(header => {
          if (currentMergeCounts[header] > 0) {
            const lastIndex = rowIndex - currentMergeCounts[header];
            mergeInfo[header][lastIndex] = currentMergeCounts[header] + 1;
          }
        });
      }
    });
  }

  function generateMergedRow(row, rowIndex) {
    let rowHtml = "<tr>";
    const headers = ['大分類', '中分類', '小分類', '代碼', '細(xì)類', '職業(yè)類別'];

    headers.forEach(header => {
      if (row[header] !== undefined && row[header] !== '') {
        const rowspan = mergeInfo[header][rowIndex] || 1;
        rowHtml += `<td ${rowspan > 1 ? `rowspan="${rowspan}"` : ''}>${row[header]}</td>`;
      } else {
        // 跳過重復(fù)的單元格
        rowHtml += '';
      }
    });

    rowHtml += "</tr>";
    return rowHtml;
  }

  function loadMoreRows() {
    const dataSlice = allData.slice(loadedRows, loadedRows + pageSize);
    if (dataSlice.length === 0) return;

    let $tbody = $('#excel-data table tbody');
    dataSlice.forEach((row, rowIndex) => {
      $tbody.append(generateMergedRow(row, loadedRows + rowIndex));
    });

    loadedRows += dataSlice.length;
  }

  function handleScroll() {
    const $container = $(this);
    const scrollTop = $container.scrollTop();
    const scrollHeight = $container[0].scrollHeight;
    const clientHeight = $container.height();

    // 當(dāng)滾動(dòng)到底部附近時(shí)加載更多數(shù)據(jù)
    if (scrollTop + clientHeight >= scrollHeight - 50) {
      loadMoreRows();
    }
  }
</script>
</body>
</html>

總結(jié) 

到此這篇關(guān)于前端本地文件獲取excel表格內(nèi)容并渲染在頁面的文章就介紹到這了,更多相關(guān)前端本地獲取excel表格并渲染內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript實(shí)現(xiàn)點(diǎn)擊小圖顯示大圖

    javascript實(shí)現(xiàn)點(diǎn)擊小圖顯示大圖

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)點(diǎn)擊小圖顯示大圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Javascript中實(shí)現(xiàn)String.startsWith和endsWith方法

    Javascript中實(shí)現(xiàn)String.startsWith和endsWith方法

    這篇文章主要介紹了Javascript中實(shí)現(xiàn)String.startsWith和endsWith方法,這兩個(gè)很好用的方法在JS中沒有,本文就自己編碼實(shí)現(xiàn)了這兩個(gè)方法,需要的朋友可以參考下
    2015-06-06
  • 理解JavaScript中的適配器模式Adapter?Pattern

    理解JavaScript中的適配器模式Adapter?Pattern

    這篇文章主要介紹了理解JavaScript中的適配器模式,適配器模式即Adapter?Pattern,是作為兩個(gè)不兼容的接口之間的橋梁。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,下文更多相關(guān)介紹需要的小伙伴可以參考一下
    2022-04-04
  • js輸出陰歷、陽歷、年份、月份、周示例代碼

    js輸出陰歷、陽歷、年份、月份、周示例代碼

    本篇文章主要是對(duì)js輸出陰歷、陽歷、年份、月份、周示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • input?獲取光標(biāo)位置設(shè)置光標(biāo)位置方案

    input?獲取光標(biāo)位置設(shè)置光標(biāo)位置方案

    這篇文章主要為大家介紹了input?獲取光標(biāo)位置設(shè)置光標(biāo)位置方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 動(dòng)態(tài)調(diào)用CSS文件的JS代碼

    動(dòng)態(tài)調(diào)用CSS文件的JS代碼

    動(dòng)態(tài)調(diào)用CSS文件,一般用于頁面的多種顏色選擇,通過調(diào)用不同的css實(shí)現(xiàn)不用的頁面顏色效果。
    2010-07-07
  • JS制作簡易計(jì)算器的實(shí)例代碼

    JS制作簡易計(jì)算器的實(shí)例代碼

    這篇文章主要介紹了JS制作簡易計(jì)算器的方法,文中實(shí)例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 如何在TypeScript中使用函數(shù)

    如何在TypeScript中使用函數(shù)

    這篇文章主要為大家介紹了如何在TypeScript中使用函數(shù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • elementui上傳圖片回顯功能實(shí)現(xiàn)

    elementui上傳圖片回顯功能實(shí)現(xiàn)

    這篇文章主要介紹了elementui上傳圖片回顯,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • JavaScript 接收鍵盤指令示例

    JavaScript 接收鍵盤指令示例

    JavaScript接收鍵盤指令示例,按下鍵盤上不同的鍵,程序會(huì)跳轉(zhuǎn)到不同的網(wǎng)頁,本例中按下A鍵程序?yàn)樘D(zhuǎn)到腳本之家的首頁,實(shí)現(xiàn)按鍵跳轉(zhuǎn)的功能。
    2009-10-10

最新評(píng)論