發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導圖
隨筆
相冊
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
最近接到需求,需要把excel表格里的數(shù)據(jù)原樣展示到web頁面,主要是滿足隨意跨行跨列。
之前用過一點NPOI,不過接觸的不太多,趁這次機會再熟悉一下。由于操作的excel都是2007以上的版本,所以選擇了2.0的版本。
這里稍微提一下2.0與1.X的區(qū)別:2.0主要針對2007及以上版本,1.X主要針對2003,此外方法也略有不同,但是過渡還是很平緩的,這里不做過多的贅述。
詳情請看官網(wǎng):點擊此處
假設一下是excel 文件的 Sheet1頁,轉(zhuǎn)換成web之后仍是同樣效果。
后臺代碼:
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的最大行數(shù) int colsCount = xsheet.GetRow(0).PhysicalNumberOfCells;//取得Excel的列數(shù) 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合并的列數(shù)和行數(shù)等信息。與Excel中對應Cell的合并行數(shù)和列數(shù)一致。 GetTdMergedInfo(xsheet, rowIndex, colIndex, out colSpan, out rowSpan, out isByRowMerged); //被合并的行或列不輸出的處理方式不一樣 //如果已經(jīng)被 行 合并包含進去了就不輸出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合并的列數(shù)和行數(shù)等信息。與Excel中對應Cell的合并行數(shù)和列數(shù)一致。 /// </summary> /// <param name="rowIndex">行號</param> /// <param name="colIndex">列號</param> /// <param name="colspan">TD中需要合并的行數(shù)</param> /// <param name="rowspan">TD中需要合并的列數(shù)</param> /// <param name="isByRowMerged">此單元格是否被某個行合并包含在內(nèi)。如果被包含在內(nèi),將不輸出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;//取得合并單元格的個數(shù) //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>'; //以下特殊業(yè)務需要,請參考自己邏輯修改 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 里的數(shù)據(jù)轉(zhuǎn)化成json格式(如下),因為還有別的用處,所以就沒直接轉(zhuǎn)換成Html的table。如果想直接轉(zhuǎn)換成Table,請參考官網(wǎng)例子
以上僅作為學習資料,方便自己以后查找,寫的不是很詳細,如有疑問可以留言。謝謝!
來自: 昵稱10504424 > 《工作》
0條評論
發(fā)表
請遵守用戶 評論公約
Gridview創(chuàng)建頭
C# 操作Excel文件之NPOI (二)
C# 操作Excel文件之NPOI (二)本篇要記錄的是使用NPOI創(chuàng)建Excel文件并將數(shù)據(jù)寫入。使用NPOI的方式將dataGridView中的數(shù)據(jù)導出到Excel.usi...
asp.net Mvc Npoi 導出導入 excel
//創(chuàng)建Workbook對象 ISheet sheet = workbook.CreateSheet("Sheet1");//創(chuàng)建工作表 IRow row = sheet.CreateRow(0);//在工作表中添加一行 ICell cell = row.CreateCell...
C#基于ItextSharp標簽生成小工具
// 設置列寬 float[] columnWidths0 = { 0.4f, 0.8f, 0.8f }; table0.SetWidths(columnWidths0); //正文第1行 PdfUtils.CreateCell(tabl...
C#創(chuàng)建Excel(.xls和.xlsx)文件的三種方法
.net 使用NPOI或MyXls把DataTable導出到Excel
.net 使用NPOI或MyXls把DataTable導出到ExcelExcel導入及導出問題產(chǎn)生: 從接觸.net到現(xiàn)在一直在維護一個DataTable導出到Excel的類,時不時還會維護一個導入類。
C#項目中操作Excel文件
1. 每一個Excel文件都可以看做是一個工作簿,當打開一個Excel文件時,就等于打開了一個Excel工作簿。以下程序新建一個Excel 2003 xls和...
NET NPOI操作Excel常用函數(shù)
NET NPOI操作Excel常用函數(shù)最近因項目接觸了NPOI,感覺還是蠻不錯的,網(wǎng)絡上的教程普遍版本較老,本篇記錄所常用操作,采用NPOI 2.0版本。新建Excel HSSFWorkbook hssfworkbook = new HSSFWorkbook();I...
C# 使用 NPOI 庫讀寫 Excel 文件
//設置該單元格為非鎖定cell.SetCellValue("未被鎖定");cell.CellStyle = unlocked;...//保護表單,password為解鎖密碼//cell.CellStyle.IsLocked = true;的單元格將為只讀sheet.ProtectShee...
微信掃碼,在手機上查看選中內(nèi)容