公司excel檔案都改成xlsx後, XLS相關就不再使用了
並沒有全面的介紹NPOI, 如果打算深入NPOI, 可以直接參考最底下的外部來源
另一個與NPOI類似用途的工具:OpenXml 介紹
簡介 / 安裝方法
【簡介】
可以操作excel檔案的
可以操作excel檔案的
Microsoft Developer Network > 學習園地 > CodePlex 教學
【安裝NPOI】
於VS中→右鍵網站或專案→管理NuGet套件→搜尋NOPI→安裝→完成
(沒錯, 就是這麼簡單)
XLS範例
- using System.IO;
- using NPOI.HSSF.UserModel;
- using NPOI.HSSF.Util;
- using NPOI.SS.UserModel;
檔案IO
建立一個新活頁簿
- //建立物件
- HSSFWorkbook workbook = new HSSFWorkbook();
- workbook.CreateSheet("試算表A");
- //將物件寫到記憶體並產生另存
- MemoryStream ms = new MemoryStream();
- workbook.Write(ms);
- Response.AddHeader("Content-Disposition", string.Format("attchment; filename=EmptyWorkbook.xls"));
- Response.BinaryWrite(ms.ToArray());
- //清空
- workbook = null;
- ms.Close();
- ms.Dispose();
取出Server中已存在的活頁簿
- string strFilePath = string.Format(Server.MapPath(".") + "\\format_eCRF\\EmptyWorkbook.xls"); //抓取ASP.NET網頁的程式位址
- HSSFWorkbook workbook;
- using (FileStream fs = new FileStream(strFilePath, FileMode.Open, FileAccess.ReadWrite))
- {
- workbook = new HSSFWorkbook(fs);
- }
- /*--IT'S SHOW TIME!--*/
- //定番
- MemoryStream ms = new MemoryStream();
- workbook.Write(ms);
- Response.AddHeader("Content-Disposition", string.Format("attchment; filename=EmptyWorkbook.xls"));
- Response.BinaryWrite(ms.ToArray());
- workbook = null;
- ms.Close();
- ms.Dispose();
(範例待續, 請先參考下方)
再用SetCellValue(value),可容許相當多種type
- //插入資料。
- HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet("My Sheet"); //新建資料表同時插入
- sheet.CreateRow(0).CreateCell(0).SetCellValue(0);
- HSSFSheet at_sheet = (HSSFSheet)workbook.GetSheetAt(0);//用索引取得資料表並插入
- at_sheet.CreateRow(0).CreateCell(0).SetCellValue("at sheet");
- HSSFSheet _sheet = (HSSFSheet)workbook.GetSheet("試算表 A"); //用資料表名取得資料表並插入
- _sheet.GetRow(0).GetCell(0).SetCellValue("get sheet by name");
欄位寬度
利用SetColumnWidth(第n攔, 寬度多少)
- workbook.GetSheetAt(0).SetColumnWidth(3, 2048);
幫cell上色
物件HSSFCellStyle中的各項方法
- //建立儲存格樣式
- HSSFSheet teststyle=(HSSFSheet)workbook.CreateSheet("sheet1");
- HSSFCellStyle style1 = (HSSFCellStyle)workbook.CreateCellStyle();
- style1.FillForegroundColor = HSSFColor.Pink.Index;
- style1.FillPattern = FillPattern.SolidForeground; //版本2.0的操作方法
- HSSFCell cell = (HSSFCell)teststyle.GetRow(0).GetCell(0);
- cell.CellStyle = style1;
函數應用
在cell中產生與欄位相呼應的值
利用LastRowNum和LastCellNum取得陣列範圍
- for (int i = 0; i < workbook.GetSheetAt(0).LastRowNum ; i++)
- {
- int n = 65;
- for (int j = 0; j < workbook.GetSheetAt(0).GetRow(1).LastCellNum; j++)
- {
- workbook.GetSheetAt(0).GetRow(i).GetCell(j).SetCellValue(Convert.ToChar(n + j).ToString() + (i+1));
- }
- }
有些程式碼無法起作用
如果範例是以2.0以前的版本去實作,可能會遇到這些問題
【需要強制轉型】HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet("My Sheet");
建議下載官方範本去看該如何在C#中使用
XLSX範例
基本上跟XLS很像, 遇到特別的再說
讀取樣板, 並另存新檔
只是能用而不太講究的話, 將HSSF全部改成XSSF就可以了
缺點是開啟檔案時, 會彈出警告視窗
替換成這段就ok了(前半仍需完成HSSF替換成XSSF)
參考官方範例並加以修改後(改成檔案是在記憶體中產生, 不留檔), 只要將下面這段
Response.AddHeader("Content-Disposition", string.Format("attchment; filename=EmptyWorkbook.xlsx"));
Response.BinaryWrite(ms.ToArray());
workbook = null;
ms.Close();
ms.Dispose();
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "editedWorkbook.xlsx"));
Response.BinaryWrite(ms.ToArray());
Response.Flush();
Response.End();
將DataSet的資料用NPOI倒入Excel
如果有要特定格式, 可善用「string.format()」
例如日期:
- 將「SetCellValue(column.ColumnName);」
- 替換成「SetCellValue(string.Format("{0:yyyy/MM/dd HH:mm:ss}", row[column]));」
DataSet相關請參考:DataSet.Tables 屬性
/*--此處開始編輯檔案*/
XSSFSheet sheet = (XSSFSheet)workbook.GetSheetAt(2);
for (int i = 0; i <= 2;i++ )
{
int rowIndex = i*3;
dt = ds.Tables.Count > 0 ? ds.Tables[i] : new DataTable();
XSSFRow headerRow = (XSSFRow)sheet.CreateRow(rowIndex);
foreach (DataColumn column in dt.Columns)
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
foreach (DataRow row in dt.Rows)
{
XSSFRow dataRow = (XSSFRow)sheet.CreateRow(rowIndex+1);
foreach (DataColumn column in dt.Columns)
{
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
}
rowIndex++;
}
}
沒有留言:
張貼留言