NPOI 2.0 Excel讀取顯示


最近接到需求,需要把excel表格里的數據原樣展示到web頁面,主要是滿足隨意跨行跨列。

之前用過一點NPOI,不過接觸的不太多,趁這次機會再熟悉一下。由於操作的excel都是2007以上的版本,所以選擇了2.0的版本。

這里稍微提一下2.0與1.X的區別:2.0主要針對2007及以上版本,1.X主要針對2003,此外方法也略有不同,但是過渡還是很平緩的,這里不做過多的贅述。

詳情請看官網:點擊此處

假設一下是excel 文件的 Sheet1頁,轉換成web之后仍是同樣效果。

日期 買入
買入額(萬元) 償還額(萬元) 凈買入額(萬元)
2014-1-30 67644.71 58602.77 9041.94
2013-12-31 520660.88 449425.22 71235.66
2013-11-29 515912.92 525626.82 -9713.91
2013-10-31 758822.25 738848.47 19973.79

 

 

 

 

 

 

 

后台代碼: 

 
         

    using NPOI;
    using NPOI.HSSF.UserModel;   //2003版本
    using NPOI.XSSF.UserModel;   //2007版本
    using NPOI.SS.UserModel;



public string ConvertExcelToJsonString() { try {
         string excelName = "data.xlsx";
string sheet = "Sheet3"; string filePath = HttpContext.Current.Server.MapPath(String.Format("~/App_Data/{0}", excelName)); //HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filePath, FileMode.Open, FileAccess.Read)); //HSSFSheet sht = (HSSFSheet)wb.GetSheet(sheet); 如果是2003 則用HSS開頭的對象。 FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read); XSSFWorkbook xworkbook = new XSSFWorkbook(file); XSSFSheet xsheet = (XSSFSheet)xworkbook.GetSheet(sheet); int rowsCount = xsheet.PhysicalNumberOfRows; //取行Excel的最大行數 int colsCount = xsheet.GetRow(0).PhysicalNumberOfCells;//取得Excel的列數 StringBuilder excelJson = new StringBuilder(); //StringBuilder table = new StringBuilder(); int colSpan; int rowSpan; bool isByRowMerged; excelJson.Append("["); //table.Append("<table border='1px'>"); for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++) { if (rowIndex > 0) { excelJson.Append(","); } excelJson.Append("["); for (int colIndex = 0; colIndex < colsCount; colIndex++) { //獲取Table某個TD合並的列數和行數等信息。與Excel中對應Cell的合並行數和列數一致。 GetTdMergedInfo(xsheet, rowIndex, colIndex, out colSpan, out rowSpan, out isByRowMerged); //被合並的行或列不輸出的處理方式不一樣 //如果已經被 行 合並包含進去了就不輸出TD了。 if (isByRowMerged) { continue; } excelJson.Append("{"); excelJson.Append(string.Format("Text:'{0}'", xsheet.GetRow(rowIndex).GetCell(colIndex))); excelJson.Append(string.Format(",ColSpan:'{0}'",colSpan)); excelJson.Append(string.Format(",RowSpan:'{0}'",rowSpan)); excelJson.Append(",Width:''"); excelJson.Append(",Align:'center'"); excelJson.Append(",Index:''"); excelJson.Append("},"); //列被合並之后此行將少輸出colSpan-1個TD。 if (colSpan > 1) colIndex += colSpan - 1; } excelJson.Remove(excelJson.Length-1,1); excelJson.Append("]"); } excelJson.Append("]"); return excelJson.toString(); } catch (Exception ex) { return null; } }

 

         /// <summary>
         ///  獲取Table某個TD合並的列數和行數等信息。與Excel中對應Cell的合並行數和列數一致。
         /// </summary>
         /// <param name="rowIndex">行號</param>
         /// <param name="colIndex">列號</param>
         /// <param name="colspan">TD中需要合並的行數</param>
         /// <param name="rowspan">TD中需要合並的列數</param>
         /// <param name="isByRowMerged">此單元格是否被某個行合並包含在內。如果被包含在內,將不輸出TD。</param>
         /// <returns></returns>
         private void GetTdMergedInfo(XSSFSheet xsheet, int rowIndex, int colIndex, out int colspan, out int rowspan, out bool isByRowMerged)
         {
             colspan = 1;
             rowspan = 1;
             isByRowMerged = false;
             int regionsCuont = xsheet.NumMergedRegions;//取得合並單元格的個數
             //Region region;
             for (int i = 0; i < regionsCuont; i++)
             {
                 //region = xsheet.GetMergedRegionAt(i); 此方法為1.2版本,高版本已去掉
                 CellRangeAddress range = xsheet.GetMergedRegion(i);//取得第i個合並單元格的跨越范圍
                 xsheet.IsMergedRegion(range);
                 //region = xsheet.GetMergedRegion(i);
                 if (range.FirstRow == rowIndex && range.FirstColumn == colIndex) 
                 {
                     colspan = range.LastColumn - range.FirstColumn + 1;
                     rowspan = range.LastRow - range.FirstRow + 1;
                     return;
                 }
                 else if (rowIndex > range.FirstRow && rowIndex <= range.LastRow && colIndex >= range.FirstColumn && colIndex <= range.LastColumn)
                 {
                     isByRowMerged = true;
                 }
             }
         }

 

前台代碼:

function ExcelDataBind(data) {
    var data = result.Data.toJSON() //此處拿到后台Json字符串
    var tableObj= $('<table border="1"  width="100%"></table>');
    var theadObj = $("<thead></thead>");
    var tbodyobj = $("<tbody></tbody>");
    for (var i = 0; i < data.length; i++) {
        var trHtml = '<tr>';
       //以下特殊業務需要,請參考自己邏輯修改
        for (var j = 0; j < data[i].length; j++) {
            var tdType = data[i][j].Index == 1 ? "th" : "td";
            var colspan = data[i][j].ColSpan == 1 ? "" : " colspan=" + data[i][j].ColSpan;
            var rowspan = data[i][j].RowSpan == 1 ? "" : " rowspan=" + data[i][j].RowSpan;
            trHtml += '<' + tdType + colspan + rowspan + ' width=' + data[i][j].Width + ' align="' + data[i][j].Align + '">' + data[i][j].Text + '</' + tdType + '>';
        }
        trHtml += '</tr>';
        
        if (data[i][0].Index == 1) {
            theadObj.append(trHtml);
        }else {
            tbodyobj.append(trHtml);
        }
    }
    tableObj.append(theadObj).append(tbodyobj);
    
}

 

以上功能是將 excel 里的數據轉化成json格式(如下),因為還有別的用處,所以就沒直接轉換成Html的table。如果想直接轉換成Table,請參考官網例子

[[{Text:'日期',ColSpan:'1',RowSpan:'2',Width:'',Align:'center',Index:''},{Text:'買入',ColSpan:'3',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'買入額(萬元)',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'償還額(萬元)',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'凈買入額(萬元)',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'30-一月-2014',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'67644.71',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'58602.77',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'9041.94',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'31-十二月-2013',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'520660.88',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'449425.22',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'71235.66',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'29-十一月-2013',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'515912.92',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'525626.82',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'-9713.91',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}],[{Text:'31-十月-2013',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'758822.25',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'738848.47',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''},{Text:'19973.79',ColSpan:'1',RowSpan:'1',Width:'',Align:'center',Index:''}]]

 

以上僅作為學習資料,方便自己以后查找,寫的不是很詳細,如有疑問可以留言。謝謝!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM