找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
請尊重及感激所有版主付出和奉獻尊貴會員無限觀看附件圖片安全提問(回答) 和 永久尊貴會員 事宜
航海王julia名偵探柯3dmg 無碼無碼 ge
お家に帰meyd 280空手道secret mfinwangnkkd227juq 620

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]肌肉魔法使-MASHL

[繁]我獨自升級11-

[繁]最強肉盾的迷宮攻

[簡]北海道辣妹金古錐

[繁]戰國妖狐12-

[繁]最強肉盾的迷宮攻
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 8626|回復: 13

[原創] 用Nuget EPPlus套件讀寫EXCEL檔案[複製鏈接]

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-4-2 09:41 AM|顯示全部樓層
本帖最後由 rr09192084 於 2016-4-5 02:56 PM 編輯

最近剛好因為需要而研究Nuget裡EPPlus這個套件,覺得它的語法直接而簡潔,的確是值得推薦。
之前我大多用Office Interop,許多人都說不建議我用這個方式,但是,我想說的是,我在職場上也有超過20年了,還沒有待過沒有應用OFFICE的公司,不學不用OFFICE的東西,到職場上再從頭學嗎?還是OFFICE的東西太淺顯易學?到時候邊學邊用來的及?這等於是多說的廢話,還是切入正題吧!
...
瀏覽完整內容,請先 註冊登入會員
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。

使用道具檢舉

Rank: 2Rank: 2

帖子
1051
積分
619 點
潛水值
27270 米
發表於 2016-4-6 11:44 AM|顯示全部樓層
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
請問這個套件有辦法讀取 xls(舊版2003以前的excel 檔) 檔嗎?
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-4-6 04:48 PM|顯示全部樓層
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
cockroachrun 發表於 2016-4-6 11:44 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

請問這個套件有辦法讀取 xls(舊版2003以前的excel 檔) 檔嗎?

它只支援Open XML也就是2007以上的EXCEL檔案格式,2003要用NOPI。...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-4-9 11:33 AM|顯示全部樓層
附上NOPI的版本,裡面內容大致與EPPlus版一樣,只是少了繪製圖表部分,會這個部分的大大可以幫忙完善一下。

下載: 訪客無法瀏覽下載點,請先 註冊登入會員

使用道具檢舉

Rank: 1

帖子
6
積分
103 點
潛水值
2078 米
發表於 2016-7-11 04:42 PM|顯示全部樓層
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。
rr09192084 發表於 2016-4-9 11:33 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

附上NOPI的版本,裡面內容大致與EPPlus版一樣,只是少了繪製圖表部分,會這個部分的大大可以幫忙完善一下。 ...

想請問一下 使用NOPI的話
...
瀏覽完整內容,請先 註冊登入會員





若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-7-11 08:49 PM|顯示全部樓層
當然可以的,首先在ExtensionUtility.cs裡添加這個擴充方法
  1.     public static void AddWorkSheet(this IWorkbook wb, DataTable dt, string sheetName = "Sheet1")
  2.         {
  3.             ISheet ws;
  4.             //如果DataTable有命名則用它來給Sheet命名,否則用sheetName的值
  5.             if (dt.TableName != string.Empty)
  6.             {
  7.                 ws = wb.CreateSheet(dt.TableName);
  8.             }
  9.             else
  10.             {
  11.                 ws = wb.CreateSheet(sheetName);
  12.             }
  13.             ws.CreateRow(0);//第一行為欄位名稱
  14.             for (int i = 0; i < dt.Columns.Count; i++)
  15.             {
  16.                 ws.GetRow(0).CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
  17.             }

  18.             for (int i = 0; i < dt.Rows.Count; i++)
  19.             {
  20.                 ws.CreateRow(i + 1);
  21.                 for (int j = 0; j < dt.Columns.Count; j++)
  22.                 {
  23.                     ws.GetRow(i + 1).CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
  24.                 }
  25.             }
  26.         }
複製代碼
然後在Form2的
  1. IWorkbook wb = this.DT.ToWorkbook();
  2. ISheet sheet = wb.GetSheetAt(0);
複製代碼
後面加上
  1. DT.TableName = "第二張Sheet";
  2. wb.AddWorkSheet(DT);
複製代碼

補充內容 (2016-7-11 08:53 PM):
所以,如果第二個DataTable叫做DT2,那麼就是
  1. wb.AddWorkSheet(DT2);
複製代碼
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

Rank: 1

帖子
6
積分
103 點
潛水值
2078 米
發表於 2016-7-12 10:14 AM|顯示全部樓層
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。
想問看看 那這樣 新繪的兩業 有辦法一樣 畫出格線嗎!?
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-7-12 09:11 PM|顯示全部樓層
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。
本帖最後由 rr09192084 於 2016-7-12 09:23 PM 編輯

寫程式有點像解數學方程式,相同的元素可以提出來,會重複使用的程式碼可以寫成方法來應用,跟之前一樣先在在ExtensionUtility.cs裡添加這個擴充方法
  1.         public static void SetBorderAllCells(this ISheet ws, NPOI.SS.UserModel.ICellStyle style)
  2.         {
  3.             var allcells = new CellRangeAddress(0, ws.LastRowNum, 0, ws.GetRow(0).LastCellNum - 1);
  4.             for (int i = allcells.FirstRow; i <= allcells.LastRow; i++)
  5.             {
  6.                 var row = ws.GetRow(i);
  7.                 for (int j = allcells.FirstColumn; j <= allcells.LastColumn; j++)
  8.                 {
  9.                     row.GetCell(j).CellStyle = style;
  10.                 }
  11.             }
  12.         }
複製代碼
然後一樣在FORM2裡應用,在
  1. DT.TableName = "測試二";
  2. wb.AddWorkSheet(DT);
複製代碼
的後面添加
  1. ICellStyle styleA = wb.CreateCellStyle();
  2. styleA.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
  3. styleA.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
  4. styleA.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
  5. styleA.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;

  6. sheet.SetBorderAllCells(styleA);
  7. //或是用下面這行都可以
  8. //wb.GetSheetAt(0).SetBorderAllCells(styleA);
  9. wb.GetSheetAt(1).SetBorderAllCells(styleA);
複製代碼
最後把之前我寫的這段刪掉
  1. //畫格線我目前只會一格一格的畫,資料多相當慢。
  2.                 //如果有先進大大會快速的一次畫所有範圍格線的方法,請不吝告知。
  3.                 /*
  4.                 for (int i = 0; i <= sheet.LastRowNum; i++)
  5.                 {
  6.                     for (int j = 0; j < sheet.GetRow(0).LastCellNum; j++)
  7.                     {
  8.                         Application.DoEvents();
  9.                         CellRangeAddress range = new CellRangeAddress(i, i, j, j);
  10.                         if (i == 0)
  11.                         {
  12.                             HSSFRegionUtil.SetBorderTop(NPOI.SS.UserModel.BorderStyle.Thin, range, (HSSFSheet)sheet, (HSSFWorkbook)wb);
  13.                         }
  14.                         HSSFRegionUtil.SetBorderBottom(NPOI.SS.UserModel.BorderStyle.Thin, range, (HSSFSheet)sheet, (HSSFWorkbook)wb);
  15.                         HSSFRegionUtil.SetBorderRight(NPOI.SS.UserModel.BorderStyle.Thin, range, (HSSFSheet)sheet, (HSSFWorkbook)wb);
  16.                         if (j == 0)
  17.                         {
  18.                             HSSFRegionUtil.SetBorderLeft(NPOI.SS.UserModel.BorderStyle.Thin, range, (HSSFSheet)sheet, (HSSFWorkbook)wb);
  19.                         }
  20.                         HSSFRegionUtil.SetBorderBottom(NPOI.SS.UserModel.BorderStyle.Thin, range, (HSSFSheet)sheet, (HSSFWorkbook)wb);
  21.                     }
  22.                 }
  23.                 */
複製代碼
這段效能不好,我把它重新寫過並包在擴充方法模組裡。...
瀏覽完整內容,請先 註冊登入會員
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。

使用道具檢舉

帖子
166
積分
29 點
潛水值
13619 米
發表於 2016-7-24 12:54 PM|顯示全部樓層
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com
我自己是用NPOI的擴充來做excel的匯出
之前從朋友還有書作者那裏推薦,
也還不錯用,操作的API很齊全,
windows、MAC、Linux都有

使用道具檢舉

Rank: 1

帖子
6
積分
103 點
潛水值
2078 米
發表於 2016-7-25 11:04 AM|顯示全部樓層
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。
rr09192084 發表於 2016-7-12 09:11 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

寫程式有點像解數學方程式,相同的元素可以提出來,會重複使用的程式碼可以寫成方法來應用,跟之前一樣先在 ...

對了 我想請問一下
...
瀏覽完整內容,請先 註冊登入會員





分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-7-25 02:02 PM|顯示全部樓層
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php
你改變GridView的資料,DataTable不會跟著改變,除非把GridView和DataTable兩者做綁定(這在網路上有資料可查),我比較建議在要輸出成EXCEL檔案時,再從GridView轉出資料到另一個DataTable上,然後轉成EXCEL檔案。
當然也可以寫一個方法,把GridView直接輸出成EXCEL檔案,一般因為資料來源也許是資料庫,才會有DataTable這個容器。
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

Rank: 1

帖子
6
積分
103 點
潛水值
2078 米
發表於 2016-8-3 06:37 PM|顯示全部樓層
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。
你好我想請問一下
我將Gridview綁定製另外一個DataTable
但是我印出來的EXCEL表格內 DATATABLE裡面沒有資料
綁定的方式是像這樣嗎!?
DataTable XDT1  = (DataTable)dataGridView2.DataSource;

                XDT1.TableName = "第二張Sheet";
                  wb.AddWorkSheet(XDT1);
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。

使用道具檢舉

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-8-8 06:24 AM|顯示全部樓層
在ExtensionUtility.cs裡添加這個擴充方法
  1. public static DataTable ToDataTable(this DataGridView dgv, String tblName = "", int minRow = 0)
  2.         {

  3.             DataTable dt = new DataTable(tblName);

  4.             // Header columns
  5.             foreach (DataGridViewColumn column in dgv.Columns)
  6.             {
  7.                 DataColumn dc = new DataColumn(column.Name.ToString());
  8.                 dt.Columns.Add(dc);
  9.             }

  10.             // Data cells
  11.             for (int i = 0; i < dgv.Rows.Count; i++)
  12.             {
  13.                 DataGridViewRow row = dgv.Rows[i];
  14.                 DataRow dr = dt.NewRow();
  15.                 for (int j = 0; j < dgv.Columns.Count; j++)
  16.                 {
  17.                     dr[j] = (row.Cells[j].Value == null) ? "" : row.Cells[j].Value.ToString();
  18.                 }
  19.                 dt.Rows.Add(dr);
  20.             }

  21.             // Related to the bug arround min size when using ExcelLibrary for export
  22.             for (int i = dgv.Rows.Count; i < minRow; i++)
  23.             {
  24.                 DataRow dr = dt.NewRow();
  25.                 for (int j = 0; j < dt.Columns.Count; j++)
  26.                 {
  27.                     dr[j] = "  ";
  28.                 }
  29.                 dt.Rows.Add(dr);
  30.             }
  31.             return dt;
複製代碼
然後再確定dataGridView2裡面有資料,可以這樣應用
  1. wb.AddWorkSheet(dataGridView2.ToDataTable("第二張Sheet"));
複製代碼
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

Rank: 2Rank: 2

帖子
541
積分
212 點
潛水值
13707 米
發表於 2016-8-31 08:24 PM|顯示全部樓層
本帖最後由 rr09192084 於 2016-8-31 08:24 PM 編輯

專案內容有更新,所以重新貼上專案檔案鏈結
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

下載: 訪客無法瀏覽下載點,請先 註冊登入會員
...
瀏覽完整內容,請先 註冊登入會員
如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部