碼迷,mamicode.com
首頁 > Windows程序 > 詳細

c# 使用NOPI 操作Excel

時間:2018-03-01 00:31:55      閱讀:2425      評論:0      收藏:0      [點我收藏+]

標簽:word   tps   是什么   target   using   建行   content   復雜   .dll   

  最近項目需要導出Excel,找來找去,微軟有自己的Excel組件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但是有一個毛病,就是程序所在電腦安裝Office,這個問題簡直是致命的,因為導出服務我們要做在服務端,程序直接生成Excel,然后客戶端路徑去下載,所以我們不可能在部署服務的時候還要在服務器上安裝office.最后終于發現有個NOPI庫,可以很好的解決這個問題,現在就將項目的Excel 片段記錄一下

  NPOI,顧名思義,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java寫成的庫,能夠幫助開發者在沒有安裝微軟Office的情況下讀寫Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。在本文發布時,POI的最新版本是3.5 beta 6。NPOI 1.x是基于POI 3.x版本開發的,與poi 3.2對應的版本是NPOI 1.2,

  現在我們要做這樣一個表格,設計到字體樣式,合并單元格。

技術分享圖片

  創建表頭樣式,列樣式還有正文樣式

 public static ICellStyle CreateHeaderStyle(IWorkbook book)
        {
            ICellStyle style = book.CreateCellStyle();
            //設置單元格的樣式:水平對齊居中
            style.Alignment = HorizontalAlignment.Center;
            style.VerticalAlignment = VerticalAlignment.Center;
            //新建一個字體樣式對象
            IFont font = book.CreateFont();
            //設置字體加粗樣式
            font.Boldweight = short.MaxValue;
            font.FontHeightInPoints = 20;
            font.Boldweight = (short)FontBoldWeight.Bold;
            font.FontName = "微軟雅黑";
            //使用SetFont方法將字體樣式添加到單元格樣式中 
            style.SetFont(font);
            return style;
        }
        public static ICellStyle CreateTitleStyle(IWorkbook book)
        {
            ICellStyle cellStyle = book.CreateCellStyle();
            cellStyle.Alignment = HorizontalAlignment.Center;
            cellStyle.VerticalAlignment = VerticalAlignment.Center;
            IFont fontLeft = book.CreateFont();
            fontLeft.FontHeightInPoints = 15;
            fontLeft.Boldweight = (short)FontBoldWeight.Bold;
            fontLeft.FontName = "宋體";
            cellStyle.ShrinkToFit = true;
            cellStyle.SetFont(fontLeft);
            return cellStyle;
        }
        public static ICellStyle CreateContentStyle(IWorkbook book)
        {
            ICellStyle cellStyle = book.CreateCellStyle();
            IFont fontLeft = book.CreateFont();
            fontLeft.FontHeightInPoints = 15;
            fontLeft.FontName = "宋體";
            cellStyle.ShrinkToFit = true;
            cellStyle.SetFont(fontLeft);
            return cellStyle;
        }

  一個Excel文件就是IWorkbook一個頁就是 一個Isheet,行是IRow,一個單元格是ICell,知道這些就好辦了。上面的就是創建各種樣式,

  創建表格,比較注意的一點就是xlsx 格式的文件需要new  XSSFWorkbook(),創建xls格式的文件需要new HSSFWorkbook();

  合并單元格   sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10))

  創建行    IRow rowHeader = sheet.CreateRow(0);

  創建頁      ISheet sheet = book.CreateSheet(dt.TableName);

  創建單元格   cell = rowTitle.CreateCell(i);

 

 #region 寫Excel 文件
                //HSSFWorkbook book = new HSSFWorkbook();
                IWorkbook book = null;
                if (filepath.IndexOf(".xlsx") > 0) // 2007版本  
                    book = new XSSFWorkbook();
                else if (filepath.IndexOf(".xls") > 0) // 2003版本  
                    book = new HSSFWorkbook();
                ISheet sheet = book.CreateSheet(dt.TableName);
                //創建Excel 頭,合并單元格10列
                sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10));
                IRow rowHeader = sheet.CreateRow(0);
                //在行中:建立單元格,參數為列號,從0計
                ICell cellHeader = rowHeader.CreateCell(0);
                //設置單元格內容
                cellHeader.SetCellValue("健康一體機檢測報告");
                cellHeader.CellStyle = CreateHeaderStyle(book);
                rowHeader.Height = 650;
                rowHeader.RowStyle = CreateHeaderStyle(book);

                //創建Excel 列
                IRow rowTitle = sheet.CreateRow(1);
                rowTitle.Height = 500;
                ICell cell = null;
                for (int i = 0; i < 9; i++)
                {
                    cell = rowTitle.CreateCell(i);
                    cell.SetCellValue(dt.Columns[i].ColumnName);
                    cell.CellStyle = CreateTitleStyle(book);
                }
                cell = rowTitle.CreateCell(9);
                cell.SetCellValue("心電");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 9, 23));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(24);
                cell.SetCellValue("血壓");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 24, 31));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(43);
                cell.SetCellValue("血氧");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 32, 33));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(34);
                cell.SetCellValue("體溫");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 34, 35));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(36);
                cell.SetCellValue("血糖");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 36, 37));
                cell.CellStyle = CreateTitleStyle(book);
                cell = rowTitle.CreateCell(38);
                cell.SetCellValue("尿液");
                sheet.AddMergedRegion(new CellRangeAddress(1, 1, 38, 48));
                cell.CellStyle = CreateTitleStyle(book);
                rowTitle = sheet.CreateRow(2);
                for (int i = 9; i <= 48; i++)
                {
                    cell = rowTitle.CreateCell(i);
                    cell.SetCellValue(dt.Columns[i].ColumnName);
                    cell.CellStyle = CreateTitleStyle(book);
                }

                for (int i = 0; i < 9; i++)
                {
                    sheet.AddMergedRegion(new CellRangeAddress(1, 2, i, i));
                }
                //開始寫數據
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    IRow rowContent = sheet.CreateRow(i + 3);
                    rowContent.Height = 500;
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        cell = rowContent.CreateCell(j);
                        if (cell != null)
                        {
                            cell.SetCellValue(Convert.ToString(dt.Rows[i][j]));
                            cell.CellStyle = CreateContentStyle(book);
                        }
                    }
                }
                // 寫入到客戶端  
                using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                {
                    book.Write(ms);
                    using (FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.Write))
                    {
                        byte[] d = ms.ToArray();
                        fs.Write(d, 0, d.Length);
                        fs.Flush();
                    }
                    book = null;
                }
                #endregion

  知道這些基本上就可以創建一個稍微復雜的表格了,但是在這之前,必須要進行NOPI庫的引入,

  官方網站:http://npoi.codeplex.com/,里面下載最新的版本庫,目前應該是2.3版本的。下載好之后,進入到npoi-master\npoi-master\solution\visualstudio,打開OOXML.sln,進行重新生成DLL,在npoi-master\npoi-master\solution\Lib這個目錄。 如下所示

技術分享圖片

  我們需要的是將NOPI.DLL  ,NOPI.OOXML.DLL ,NOPI.OPENXML4NET.DLL,ICSharpCode.SharpZipLib.DLL.NPOI.OpenXmlFormats.dll這五個庫進入到工程即可。現在將編譯好的庫供大家下載

https://files.cnblogs.com/files/techdreaming/lib.zip

 

c# 使用NOPI 操作Excel

標簽:word   tps   是什么   target   using   建行   content   復雜   .dll   

原文地址:https://www.cnblogs.com/techdreaming/p/8485895.html

(0)
(0)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 mamicode.com 版權所有 京ICP備13008772號-2
迷上了代碼!
25选5历史开奖结果百度