C#操作NPOI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出
首先在項(xiàng)目中引用NPOI,通過管理NuGet程序包,搜索NPOI,選擇版本2.3.0(支持.NET Framework 4.0)根據(jù)自己項(xiàng)目選擇適當(dāng)版本。
1.NpoiExcelHelper.cs Npoi操作Excel類
using System.Data; using System.IO; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; /// <summary> /// Npoi操作Excel類 /// </summary> public static class NpoiExcelHelper { /// <summary> /// 根據(jù)Excel文件類型返回IWorkbook /// </summary> /// <param name="fileName">文件路徑/文件名稱(含后綴名)</param> /// <param name="rowNum">Excel行數(shù)</param> /// <param name="colNum">Excel列數(shù)</param> /// <param name="isFirstRowColumn">第一行是否是標(biāo)題</param> /// <returns></returns> public static IWorkbook GetWorkbook(string fileName, out int rowNum, out int colNum, bool isFirstRowColumn = true) { bool isXlsx = Path.GetExtension(fileName).Equals(".xlsx"); if (isXlsx) { if (isFirstRowColumn) { rowNum = 1048575; } else { rowNum = 1048576; } colNum = 16384; } else { if (isFirstRowColumn) { rowNum = 65535; } else { rowNum = 65536; } colNum = 256; } if (File.Exists(fileName)) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { if (isXlsx) { return new XSSFWorkbook(fs); } else { return new HSSFWorkbook(fs); } } } else { if (isXlsx) { return new XSSFWorkbook(); } else { return new HSSFWorkbook(); } } } /// <summary> /// 將DataTable中的數(shù)據(jù)導(dǎo)入到excel中(第一行是標(biāo)題) /// 支持根據(jù)Excel數(shù)據(jù)自動(dòng)分頁(多個(gè)Sheet) /// </summary> /// <param name="dt">DataTable</param> /// <param name="fileName">文件路徑/文件名稱(含后綴名)</param> /// <param name="columnFieldText">字段對應(yīng)中文 順序需要跟Excel中數(shù)據(jù)順序一致</param> /// <param name="sheetName">Excel中Sheet名稱(多個(gè)sheet時(shí) 名字后面自動(dòng)加上數(shù)字序號)</param> /// <returns></returns> public static byte[] DataTableToExcel(DataTable dt, string fileName, string[,] columnFieldText = null, string sheetName = null) { int rowNum = 0; int colNum = 0; IWorkbook workbook = GetWorkbook(fileName, out rowNum, out colNum); var recordNum = dt.Rows.Count; int totalPage = recordNum % rowNum == 0 ? recordNum / rowNum : recordNum / rowNum + 1; for (var p = 0; p < totalPage; p++) { if (string.IsNullOrEmpty(sheetName)) { sheetName = dt.TableName; } if (totalPage > 1) { if (string.IsNullOrEmpty(sheetName)) { sheetName = "Sheet"; } sheetName = sheetName + (p + 1).ToString(); } else { if (string.IsNullOrEmpty(sheetName)) { sheetName = "Sheet1"; } } ISheet sheet = workbook.CreateSheet(sheetName);//創(chuàng)建工作表 #region 標(biāo)題 IRow row = sheet.CreateRow(0);//在工作表中添加一行 if (columnFieldText != null) { var dataColumn = columnFieldText.GetLength(0); if (dataColumn <= colNum) { for (int m = 0; m < dataColumn; m++) { ICell cell = row.CreateCell(m);//在行中添加一列 cell.SetCellValue(columnFieldText[m, 1]);//設(shè)置列的內(nèi)容 } } else { //數(shù)據(jù)列數(shù)超過了Excel的列數(shù) } } else { var dataColumn = dt.Columns.Count; if (dataColumn <= colNum) { for (int i = 0; i < dataColumn; i++) { ICell cell = row.CreateCell(i);//在行中添加一列 cell.SetCellValue(dt.Columns[i].ColumnName);//設(shè)置列的內(nèi)容 } } else { //數(shù)據(jù)列數(shù)超過了Excel的列數(shù) } } #endregion #region 填充數(shù)據(jù) int startIndex = p * rowNum; int endindex = (p + 1) * rowNum - 1; if (endindex >= recordNum) { endindex = recordNum - 1; } for (int i = startIndex; i <= endindex; i++)//遍歷DataTable行 { DataRow dataRow = dt.Rows[i]; row = sheet.CreateRow(i - startIndex + 1);//在工作表中添加一行 if (columnFieldText != null) { var dataColumn = columnFieldText.GetLength(0); if (dataColumn <= colNum) { for (int m = 0; m < dataColumn; m++) { ICell cell = row.CreateCell(m);//在行中添加一列 cell.SetCellValue(dataRow[columnFieldText[m, 0]].ToString());//設(shè)置列的內(nèi)容 } } else { //數(shù)據(jù)列數(shù)超過了Excel的列數(shù) } } else { var dataColumn = dt.Columns.Count; if (dataColumn <= colNum) { for (int j = 0; j < dt.Columns.Count; j++)//遍歷DataTable列 { ICell cell = row.CreateCell(j);//在行中添加一列 cell.SetCellValue(dataRow[j].ToString());//設(shè)置列的內(nèi)容 } } else { //數(shù)據(jù)列數(shù)超過了Excel的列數(shù) } } } #endregion } #region 輸出Excel using (MemoryStream stream = new MemoryStream()) { workbook.Write(stream); return stream.ToArray(); } #endregion } /// <summary> /// 將excel中的數(shù)據(jù)導(dǎo)入到DataTable中(第一行是標(biāo)題) /// 支持多個(gè)sheet數(shù)據(jù)導(dǎo)入(建議多個(gè)sheet的數(shù)據(jù)格式保持一致,將沒有數(shù)據(jù)的sheet刪除) /// </summary> /// <param name="fileName">文件路徑(含文件名稱后綴名)</param> /// <param name="columnFieldText">字段對應(yīng)中文 順序需要跟Excel中數(shù)據(jù)順序一致</param> /// <param name="sheetName">指定Excel中Sheet名稱 如果為null時(shí),讀取所有sheet中的數(shù)據(jù)</param> /// <returns>返回的DataTable</returns> public static DataTable ExcelToDataTable(string fileName, string[,] columnFieldText = null, string sheetName = null) { DataTable data = new DataTable(); int rowNum = 0; int colNum = 0; IWorkbook workbook = GetWorkbook(fileName, out rowNum, out colNum); for (int e = 0; e < workbook.NumberOfSheets; e++) { ISheet sheet = workbook.GetSheetAt(e); if (sheet != null) { var currentSheetIndex = 0; if (!string.IsNullOrEmpty(sheetName)) { if (sheet.SheetName == sheetName) { currentSheetIndex = e; } } IRow firstRow = sheet.GetRow(0); if (firstRow != null) { int cellCount = firstRow.LastCellNum; //一行最后一個(gè)cell的編號 即總的列數(shù) var dataColumn = columnFieldText != null ? columnFieldText.GetLength(0) : cellCount; int startRow = sheet.FirstRowNum; if (dataColumn <= colNum) { if (e == currentSheetIndex) { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { ICell cell = firstRow.GetCell(i); if (cell != null) { string cellValue = cell.StringCellValue; if (cellValue != null) { DataColumn column = new DataColumn((columnFieldText != null ? columnFieldText[i, 0] : cellValue)); data.Columns.Add(column); } } } } startRow = sheet.FirstRowNum + 1; //最后一列的標(biāo)號 int rowCount = sheet.LastRowNum; for (int i = startRow; i <= rowCount; ++i) { IRow row = sheet.GetRow(i); if (row == null) continue; //沒有數(shù)據(jù)的行默認(rèn)是null DataRow dataRow = data.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j) { if (row.GetCell(j) != null) //同理,沒有數(shù)據(jù)的單元格都默認(rèn)是null dataRow[j] = row.GetCell(j).ToString(); } data.Rows.Add(dataRow); } } else { //數(shù)據(jù)列數(shù)超過了Excel的列數(shù) } } if (!string.IsNullOrEmpty(sheetName)) { if (sheet.SheetName == sheetName) { break; } } } } return data; } }
2.WEB項(xiàng)目的調(diào)用方法
(1)數(shù)據(jù)導(dǎo)出到Excel中(支持根據(jù)DataTable數(shù)據(jù)及Excel自動(dòng)分成多個(gè)Sheet)
調(diào)用方法:
int record = 500; DataTable data = CreateDataTable(record); string fileName = "客戶明細(xì)_" + DateTime.Now.ToString("MMddhhmmss") + ".xls"; string sheetName = "客戶明細(xì)"; string[,] columnFieldText = new[,]{ { "ID", "編號" }, { "Name", "姓名" }, { "CreateTime", "創(chuàng)建時(shí)間" } }; //string[,] columnFieldText = null; var buf = NpoiExcelHelper.DataTableToExcel(data, fileName, columnFieldText, sheetName); Response.Buffer = true; Response.Clear(); Response.ClearHeaders(); Response.ClearContent(); Response.Charset = "UTF8"; Response.ContentEncoding = Encoding.UTF8; Response.ContentType = "application/vnd.ms-excel"; string browser = Request.Browser.Browser; if (browser.Contains("InternetExplorer")) Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8)); else Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); Response.AddHeader("Content-Length", buf.Length.ToString()); Response.Flush(); Response.BinaryWrite(buf);
/// <summary> /// 創(chuàng)建DataTable對象 /// </summary> public DataTable CreateDataTable(int record) { //創(chuàng)建DataTable DataTable dt = new DataTable("NewDt"); //創(chuàng)建自增長的ID列 DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32")); dc.AutoIncrement = true; //自動(dòng)增加 dc.AutoIncrementSeed = 1; //起始為1 dc.AutoIncrementStep = 1; //步長為1 dc.AllowDBNull = false; //非空 //創(chuàng)建其它列表 dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String"))); dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime"))); DataRow dr; for (int i = 0; i < record; i++) { dr = dt.NewRow(); dr["Name"] = "名字" + i.ToString(); dr["CreateTime"] = DateTime.Now; dt.Rows.Add(dr); } return dt; }
(2)Excel中數(shù)據(jù)導(dǎo)入DataTable中(支持指定Sheet名稱 / 多個(gè)數(shù)據(jù)格式一致的Shee)
string fileName = "客戶明細(xì)_0213023109.xls"; string sheetName = "客戶明細(xì)1"; string[,] columnFieldText = new[,]{ { "ID", "編號" }, { "Name", "姓名" }, { "CreateTime", "創(chuàng)建時(shí)間" } }; //string[,] columnFieldText = null; var dt = NpoiExcelHelper.ExcelToDataTable(Server.MapPath(fileName), columnFieldText, sheetName);
到此這篇關(guān)于C#操作NPOI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出的文章就介紹到這了,更多相關(guān)C# NPOIExcel數(shù)據(jù)導(dǎo)入導(dǎo)出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# WPF上位機(jī)實(shí)現(xiàn)和下位機(jī)TCP通訊的方法
這篇文章主要介紹了C# WPF上位機(jī)實(shí)現(xiàn)和下位機(jī)TCP通訊的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03C#設(shè)置自定義文件圖標(biāo)實(shí)現(xiàn)雙擊啟動(dòng)(修改注冊表)
這篇文章介紹的是利用C#設(shè)置自定義文件圖標(biāo),然后實(shí)現(xiàn)雙擊啟動(dòng)的功能,文章給出了示例代碼,介紹的很詳細(xì),有需要的可以參考借鑒。2016-08-08基于C#的音樂播放器主Form實(shí)現(xiàn)代碼
這篇文章主要介紹了基于C#的音樂播放器主Form實(shí)現(xiàn)代碼,很實(shí)用的功能,需要的朋友可以參考下2014-08-08c# winform時(shí)鐘的實(shí)現(xiàn)代碼
這篇文章主要介紹了c# winform時(shí)鐘的實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2014-01-01