NPOI

通过Nuget安装NPOI类库

  1   public class ExcelOperator

  2     {

  3         /// <summary>

  4         /// Init Workbook

  5         /// </summary>

  6         /// <param name="path">excel file path</param>

  7         /// <returns></returns>

  8         private IWorkbook InitializeWorkbook(string path)

  9         {

 10             string extension = Path.GetExtension(path);

 11             if (string.IsNullOrEmpty(extension) ||

 12                 (

 13                  !".xlsx".Equals(extension.ToLower()) &&

 14                  !".xls".Equals(extension.ToLower())

 15                 )

 16                )

 17             {

 18                 throw new InvalidOperationException("this is not a excel file");

 19             }

 20 

 21             IWorkbook workbook;

 22 

 23             if (".xlsx".Equals(extension.ToLower()))

 24             {

 25                 workbook = new XSSFWorkbook();

 26             }

 27             else

 28             {

 29                 workbook = new HSSFWorkbook();

 30             }

 31 

 32             return workbook;

 33         }

 34 

 35         /// <summary>

 36         /// Init Workbook

 37         /// </summary>

 38         /// <param name="path">excel file path</param>

 39         /// <param name="fileStream"></param>

 40         /// <returns></returns>

 41         private IWorkbook InitializeWorkbook(string path, out FileStream fileStream)

 42         {

 43             string extension = Path.GetExtension(path);

 44             if (string.IsNullOrEmpty(extension) ||

 45                 (

 46                  !".xlsx".Equals(extension.ToLower()) &&

 47                  !".xls".Equals(extension.ToLower())

 48                 )

 49                )

 50             {

 51                 throw new InvalidOperationException("this is not a excel file");

 52             }

 53 

 54             IWorkbook workbook;

 55             fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);

 56 

 57             if (".xlsx".Equals(extension.ToLower()))

 58             {

 59                 workbook = new XSSFWorkbook(fileStream);

 60             }

 61             else

 62             {

 63                 workbook = new HSSFWorkbook(fileStream);

 64             }

 65 

 66             return workbook;

 67         }

 68 

 69         /// <summary>

 70         /// 将excel中的数据导入到DataTable中

 71         /// </summary>

 72         /// <param name="path">excel路径</param>

 73         /// <param name="sheetName">excel工作薄sheet的名称</param>

 74         /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>

 75         /// <returns>返回的DataTable</returns>

 76         public DataTable ExcelToDataTable(string path, string sheetName, bool isFirstRowColumn)

 77         {

 78             FileStream fileStream = null;

 79 

 80             try

 81             {

 82                 DataTable data = new DataTable();

 83 

 84                 IWorkbook workbook = InitializeWorkbook(path, out fileStream);

 85 

 86                 //如果不指定sheet,则获取第一个sheet

 87                 ISheet sheet = sheetName != null ? workbook.GetSheet(sheetName) : workbook.GetSheetAt(0);

 88 

 89                 //check sheet是否存在

 90                 if (sheet == null)

 91                 {

 92                     throw new InvalidOperationException("Sheet does not exist");

 93                 }

 94 

 95                 IRow firstRow = sheet.GetRow(0);

 96                 int firstCellNum = firstRow.FirstCellNum;

 97                 int lastCellNum = firstRow.LastCellNum;

 98 

 99                 int startRow = 0;

100                 if (isFirstRowColumn)

101                 {

102                     //添加列

103                     for (int i = firstCellNum; i < lastCellNum; i++)

104                     {

105                         ICell cell = firstRow.GetCell(i);

106                         if (cell != null)

107                         {

108                             string cellValue = cell.StringCellValue;

109                             if (cellValue != null)

110                             {

111                                 var column = new DataColumn(cellValue);

112                                 data.Columns.Add(column);

113                             }

114                         }

115                     }

116                     startRow = sheet.FirstRowNum + 1;

117                 }

118                 else

119                 {

120                     startRow = sheet.FirstRowNum;

121                 }

122 

123                 //最后一列的标号

124                 int rowCount = sheet.LastRowNum;

125                 for (int i = startRow; i <= rowCount; i++)

126                 {

127                     IRow row = sheet.GetRow(i);

128                     if (row == null) continue;

129 

130                     DataRow dataRow = data.NewRow();

131                     for (int j = firstCellNum; j < lastCellNum; j++)

132                     {

133                         if (row.GetCell(j) != null)

134                             dataRow[j] = row.GetCell(j).ToString();

135                     }

136                     data.Rows.Add(dataRow);

137                 }

138 

139                 return data;

140             }

141             catch (Exception)

142             {

143                 throw;

144             }

145             finally

146             {

147                 if (fileStream != null) fileStream.Close();

148             }

149         }

150 

151         /// <summary>

152         /// 将DataTable数据导入到excel中

153         /// </summary>

154         /// <param name="data">要导入的数据</param>

155         /// <param name="sheetName">要导入的excel的sheet的名称</param>

156         /// <param name="isColumnWritten">DataTable的列名是否要导入</param>

157         /// <param name="path">要导入数据的excel路径</param>

158         /// <returns>导入数据行数(包含列名那一行)</returns>

159         public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten, string path)

160         {

161             int count;

162 

163             IWorkbook workbook = InitializeWorkbook(path);

164 

165             if (string.IsNullOrEmpty(sheetName))

166             {

167                 sheetName = "Sheet1";

168             }

169 

170             ISheet sheet = workbook.CreateSheet(sheetName);

171             //写入DataTable的列名

172             if (isColumnWritten)

173             {

174                 IRow row = sheet.CreateRow(0);

175                 for (int j = 0; j < data.Columns.Count; ++j)

176                 {

177                     row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);

178                 }

179                 count = 1;

180             }

181             else

182             {

183                 count = 0;

184             }

185 

186             //写入行数据

187             for (int i = 0; i < data.Rows.Count; ++i)

188             {

189                 IRow row = sheet.CreateRow(count);

190                 for (int j = 0; j < data.Columns.Count; ++j)

191                 {

192                     row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());

193                 }

194                 count++;

195             }

196 

197             using (var fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))

198             {

199                 workbook.Write(fileStream);

200             }

201 

202             return count;

203         }

204 

205     }

 

你可能感兴趣的:(poi)