Npoi

Posted hegezhishouzhetian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Npoi相关的知识,希望对你有一定的参考价值。

  1 /************************************************************************
  2 * Copyright (c) 2019 All Rights Reserved.
  3 *创建人:wyh
  4 *创建时间:2019-04-01 13:26:43
  5 *描述
  6 *=======================================================================
  7 *修改标记
  8 *修改时间:2019-04-01 13:26:43
  9 *修改人:wyh
 10 *描述:
 11 ************************************************************************/
 12 using System;
 13 using System.Collections.Generic;
 14 using System.Data;
 15 using System.IO;
 16 using System.Linq;
 17 using System.Text;
 18 using System.Threading.Tasks;
 19 using NPOI.HSSF.UserModel;
 20 using NPOI.SS.UserModel;
 21 using NPOI.XSSF.UserModel;
 22 
 23 namespace lmsHTETest
 24 {
 25     public class ExcelHelper : IDisposable
 26     {
 27         private string fileName = null; //文件名
 28         private IWorkbook workbook = null;
 29         private FileStream fs = null;
 30         private bool disposed;
 31         
 32 
 33         public ExcelHelper(string fileName)
 34         {
 35             this.fileName = fileName;
 36             disposed = false;
 37         }
 38 
 39         /// <summary>
 40         /// 将DataTable数据导入到excel中
 41         /// </summary>
 42         /// <param name="data">要导入的数据</param>
 43         /// <param name="isColumnWritten">DataTable的列名是否要导入</param>
 44         /// <param name="sheetName">要导入的excel的sheet的名称</param>
 45         /// <returns>导入数据行数(包含列名那一行)</returns>
 46 //        public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten)
 47 //        {
 48             public  bool DataTableToExcel(DataTable dt,string sheetname)
 49             {
 50                 bool result = false;
 51                 IWorkbook workbook = null;
 52                 FileStream fs = null;
 53                 IRow row = null;
 54                 ISheet sheet = null;
 55                 ICell cell = null;
 56                 try
 57                 {
 58                     if (dt != null && dt.Rows.Count > 0)
 59                     {
 60                         workbook = new HSSFWorkbook();
 61                         sheet = workbook.CreateSheet(sheetname);//创建一个名称为Sheet0的表  
 62                         int rowCount = dt.Rows.Count;//行数  
 63                         int columnCount = dt.Columns.Count;//列数  
 64 
 65                     //设置列头  
 66                     //row = sheet.CreateRow(0);//excel第一行设为列头  
 67                     //for (int c = 0; c < columnCount; c++)
 68                         //{
 69                         //    cell = row.CreateCell(c);
 70                         //    cell.SetCellValue(dt.Columns[c].ColumnName);
 71                         //}
 72 
 73                         //设置每行每列的单元格,  
 74                         for (int i = 0; i < rowCount; i++)
 75                         {
 76                             row = sheet.CreateRow(i + 1);
 77                             for (int j = 0; j < columnCount; j++)
 78                             {
 79                                 cell = row.CreateCell(j);//excel第二行开始写入数据  
 80                                 cell.SetCellValue(dt.Rows[i][j].ToString());
 81                             }
 82                         }
 83                         using (fs = File.OpenWrite(@"D:/myxls.xls"))
 84                         {
 85                             workbook.Write(fs);//向打开的这个xls文件中写入数据  
 86                             result = true;
 87                         }
 88                     }
 89                     return result;
 90                 }
 91                 catch (Exception ex)
 92                 {
 93                     if (fs != null)
 94                     {
 95                         fs.Close();
 96                     }
 97                     return false;
 98                 }
 99             }
100 
101         /// <summary>
102         /// 将excel中的数据导入到DataTable中
103         /// </summary>
104         /// <param name="sheetName">excel工作薄sheet的名称</param>
105         /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
106         /// <returns>返回的DataTable</returns>
107         public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
108         {
109             ISheet sheet = null;
110             DataTable data = new DataTable();
111             int startRow = 0;
112             try
113             {
114                 fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
115                 if (fileName.IndexOf(".xlsx") > 0) // 2007版本
116                     workbook = new XSSFWorkbook(fs);
117                 else if (fileName.IndexOf(".xls") > 0) // 2003版本
118                     workbook = new HSSFWorkbook(fs);
119 
120                 if (sheetName != null)
121                 {
122                     sheet = workbook.GetSheet(sheetName);
123                     if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
124                     {
125                         sheet = workbook.GetSheetAt(0);
126                     }
127                 }
128                 else
129                 {
130                     sheet = workbook.GetSheetAt(0);
131                 }
132                 if (sheet != null)
133                 {
134                     IRow firstRow = sheet.GetRow(0);
135                     int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
136 
137                     if (isFirstRowColumn)
138                     {
139                         for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
140                         {
141                             ICell cell = firstRow.GetCell(i);
142                             if (cell != null)
143                             {
144                                 string cellValue = cell.StringCellValue;
145                                 if (cellValue != null)
146                                 {
147                                     DataColumn column = new DataColumn(cellValue);
148                                     data.Columns.Add(column);
149                                 }
150                             }
151                         }
152                         startRow = sheet.FirstRowNum + 1;
153                     }
154                     else
155                     {
156                         startRow = sheet.FirstRowNum;
157                     }
158 
159                     //最后一列的标号
160                     int rowCount = sheet.LastRowNum;
161                     for (int i = startRow; i <= rowCount; ++i)
162                     {
163                         IRow row = sheet.GetRow(i);
164                         if (row == null) continue; //没有数据的行默认是null       
165 
166                         DataRow dataRow = data.NewRow();
167                         
168                         for (int j = row.FirstCellNum; j < cellCount; ++j)
169                         {
170                             if (row.FirstCellNum != -1)
171                             {
172                                 if (row.GetCell(j) != null)
173                                 {
174                                     if (row.GetCell(j).CellType == CellType.Formula &&row.GetCell(j).ColumnIndex ==5)
175                                     {
176                                         row.GetCell(j).SetCellType(CellType.String);
177                                         dataRow[j] = Math.Round(decimal.Parse(row.GetCell(j).StringCellValue),2);
178                                     }
179                                     else
180                                     {
181                                         dataRow[j] = row.GetCell(j).ToString();
182                                     }
183                                 } //同理,没有数据的单元格都默认是null
184                                     
185                             }
186                             
187                         }
188                         data.Rows.Add(dataRow);
189                     }
190                 }
191 
192                 return data;
193             }
194             catch (Exception ex)
195             {
196                 Console.WriteLine("Exception: " + ex.Message);
197                 return null;
198             }
199         }
200 
201         public void Dispose()
202         {
203             Dispose(true);
204             GC.SuppressFinalize(this);
205         }
206 
207         protected virtual void Dispose(bool disposing)
208         {
209             if (!this.disposed)
210             {
211                 if (disposing)
212                 {
213                     if (fs != null)
214                         fs.Close();
215                 }
216 
217                 fs = null;
218                 disposed = true;
219             }
220         }
221     }
222 }

使用

 1 using (ExcelHelper excelHelper = new ExcelHelper(FileName))
 2                 {
 3                     excellist = excelHelper.ExcelToDataTable("正误名单", true);
 4                 }
 5                 var ccount = excellist.Columns.Count;
 6                 var rcount = excellist.Rows.Count;
 7                 var str = "";
 8                 var j = 0;
 9                 for (int i = 0; i < rcount; i+=j)
10                 {
11                     var strexerciseid = excellist.Rows[i][0].ToString();
12                 }

 

以上是关于Npoi的主要内容,如果未能解决你的问题,请参考以下文章

NPOI 列宽自适应 代码示例

c#使用NPOI进行Excel导入导出,附源码,vs2010

NPOI操作Excel文件

NPOI通过NPOI从内存流中创建EXCEL

NPOI 导出 excel 性能测试

NPOI操作创建Excel