【NPOI】.NET EXCEL导入导出开发包
1.導出
?? //工作簿HSSFWorkbook
??????????? HSSFWorkbook hssfworkbook = new HSSFWorkbook();
?? //ISheet頁
??????????? ISheet sheet1 = hssfworkbook.CreateSheet("員工資料");
?? //創建行?????????
??????????? IRow rowHeader = sheet1.CreateRow(0);
?? //設置第一行中的每一個單元格
??????????? rowHeader.CreateCell(0, CellType.STRING).SetCellValue("工號");
?? //保存
?????????? using (Stream stream = File.OpenWrite(filename))
?????????? {
?????????????? hssfworkbook.Write(stream);
?????????? }
2.設置樣式
?????????? ICellStyle cellStyle = hssfworkbook.CreateCellStyle();
??????????? IDataFormat dataFormat = hssfworkbook.CreateDataFormat();
??????????? cellStyle.DataFormat = dataFormat.GetFormat("yyyy\"年\"m\"月\"d\"日\"");?
//入職日期
??????????? ICell InDateCell = rowContent.CreateCell(3, CellType.NUMERIC);
??????????? InDateCell.CellStyle = cellStyle;
??????????? InDateCell.SetCellValue(item.InDate);?
??????????? //設置Excel表格
3.設置寬度
在使用NPOI技術開發自動操作EXCEL軟件時遇到不能精確設置列寬的問題。
如
ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
sheet1.SetColumnWidth(0,? 50 * 256);?? // 在EXCEL文檔中實際列寬為49.29
sheet1.SetColumnWidth(1, 100 * 256);?? // 在EXCEL文檔中實際列寬為99.29
sheet1.SetColumnWidth(2, 150 * 256);?? // 在EXCEL文檔中實際列寬為149.29
到此一般人應該知道問題出在哪了,解決方法如下:
ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
sheet1.SetColumnWidth(0,? (int)((50 + 0.72) * 256));?? // 在EXCEL文檔中實際列寬為50
sheet1.SetColumnWidth(1,? (int)((100 + 0.72) * 256));?? // 在EXCEL文檔中實際列寬為100
sheet1.SetColumnWidth(2,? (int)((150 + 0.72) * 256));?? // 在EXCEL文檔中實際列寬為150
既在要設置的實際列寬中加上列寬基數:0.72
NPOI讀寫Excel
1、整個Excel表格叫做工作表:WorkBook(工作薄),包含的叫頁(工作表):Sheet;行:Row;單元格Cell。
2、NPOI是POI的C#版本,NPOI的行和列的index都是從0開始
3、POI讀取Excel有兩種格式一個是HSSF,另一個是XSSF。 HSSF和XSSF的區別如下:
HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format.
XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format.
即:HSSF適用2007以前的版本,XSSF適用2007版本及其以上的。
下面是用NPOI讀寫Excel的例子:ExcelHelper封裝的功能主要是把DataTable中數據寫入到Excel中,或者是從Excel讀取數據到一個DataTable中。
ExcelHelper類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; using System.IO; using System.Data;namespace GMapDemo {class ExcelHelper : IDisposable{private string fileName = null; //文件名private IWorkbook workbook = null;private FileStream fs = null;private bool disposed;public ExcelHelper(string fileName){this.fileName = fileName;disposed = false;}/// <summary>/// 將DataTable數據導入到excel中/// </summary>/// <param name="data">要導入的數據</param>/// <param name="isColumnWritten">DataTable的列名是否要導入</param>/// <param name="sheetName">要導入的excel的sheet的名稱</param>/// <returns>導入數據行數(包含列名那一行)</returns>public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten){int i = 0;int j = 0;int count = 0;ISheet sheet = null;fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);if (fileName.IndexOf(".xlsx") > 0) // 2007版本workbook = new XSSFWorkbook();else if (fileName.IndexOf(".xls") > 0) // 2003版本workbook = new HSSFWorkbook();try{if (workbook != null){sheet = workbook.CreateSheet(sheetName);}else{return -1;}if (isColumnWritten == true) //寫入DataTable的列名{IRow row = sheet.CreateRow(0);for (j = 0; j < data.Columns.Count; ++j){row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);}count = 1;}else{count = 0;}for (i = 0; i < data.Rows.Count; ++i){IRow row = sheet.CreateRow(count);for (j = 0; j < data.Columns.Count; ++j){row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());}++count;}workbook.Write(fs); //寫入到excelreturn count;}catch (Exception ex){Console.WriteLine("Exception: " + ex.Message);return -1;}}/// <summary>/// 將excel中的數據導入到DataTable中/// </summary>/// <param name="sheetName">excel工作薄sheet的名稱</param>/// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>/// <returns>返回的DataTable</returns>public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn){ISheet sheet = null;DataTable data = new DataTable();int startRow = 0;try{fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);if (fileName.IndexOf(".xlsx") > 0) // 2007版本workbook = new XSSFWorkbook(fs);else if (fileName.IndexOf(".xls") > 0) // 2003版本workbook = new HSSFWorkbook(fs);if (sheetName != null){sheet = workbook.GetSheet(sheetName);}else{sheet = workbook.GetSheetAt(0);}if (sheet != null){IRow firstRow = sheet.GetRow(0);int cellCount = firstRow.LastCellNum; //一行最后一個cell的編號 即總的列數if (isFirstRowColumn){for (int i = firstRow.FirstCellNum; i < cellCount; ++i){DataColumn column = new DataColumn(firstRow.GetCell(i).StringCellValue);data.Columns.Add(column);}startRow = sheet.FirstRowNum + 1;}else{startRow = sheet.FirstRowNum;}//最后一列的標號int rowCount = sheet.LastRowNum;for (int i = startRow; i <= rowCount; ++i){IRow row = sheet.GetRow(i);if (row == null) continue; //沒有數據的行默認是null DataRow dataRow = data.NewRow();for (int j = row.FirstCellNum; j < cellCount; ++j){if (row.GetCell(j) != null) //同理,沒有數據的單元格都默認是nulldataRow[j] = row.GetCell(j).ToString();}data.Rows.Add(dataRow);}}return data;}catch (Exception ex){Console.WriteLine("Exception: " + ex.Message);return null;}}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!this.disposed){if (disposing){if (fs != null)fs.Close();}fs = null;disposed = true;}}} }轉載于:https://www.cnblogs.com/mcad/p/4124035.html
總結
以上是生活随笔為你收集整理的【NPOI】.NET EXCEL导入导出开发包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手枪按动作方式分类可分为(+)手枪。A半
- 下一篇: 广东省内河船舶走港澳航线需要省际航线吗?