项目中的一个功能是将数据导入到Excel文件中,这里使用NPOI操作Excel,代码如下:
public class Excel : IDataTransfer
{
public Stream Export(string[] titles, List<string>[] dataSource)
{
return ExportData(titles, dataSource);
}
protected virtual Stream ExportData(string[] titles, List<string>[] dataSource)
{
if (dataSource == null)
{
throw new ArgumentNullException();
}
HSSFWorkbook book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet("sheet1");
int rowCount = dataSource.Length;
int cellCount = dataSource[0].Count;
var titleRow = sheet.CreateRow(0);
#region header style
// 该行的高度
titleRow.HeightInPoints = 18;
// 列的样式
ICellStyle headStyle = book.CreateCellStyle();
// 单元格内容居中显示
headStyle.Alignment = HorizontalAlignment.Center;
// 字体样式
IFont font = book.CreateFont();
// 字体大小
font.FontHeightInPoints = 12;
// 粗体
font.Boldweight = 1200;
// 字体颜色
font.Color = NPOI.HSSF.Util.HSSFColor.Green.Index;
headStyle.SetFont(font);
// 边框
headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
#endregion
for (int i = 0; i < titles.Length; i++)
{
ICell cell = titleRow.CreateCell(i);
cell.SetCellValue(titles[i]);
cell.CellStyle = headStyle;
}
for (int i = 0; i < rowCount; i++)
{
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < cellCount; j++)
{
row.CreateCell(j).SetCellValue(dataSource[i][j]);
}
}
Stream stream = new MemoryStream();
book.Write(stream);
book.Close();
stream.Position = 0;
return stream;
}
}
Contorller中的代码:
Excel excel = new Excel();
Stream dataStream = excel.Export(titles.ToArray(), data);
return new FileStreamResult(dataStream, "application/ms-excel") { FileDownloadName = "exportInfo.xlsx" };
整个功能的实现并没有太大难度,这里有一点需要注意就是Excel
类中的protected virtual Stream ExportData(string[] titles, List<string>[] dataSource)
方法,这个方法返回一个流,流中包含要导出的数据。方法的倒数第二行:stream.Position = 0;
,这里需要特别注意,将数据写入流中之后,流的位置在最末端,我们要将流的位置重置到起始位置,否则无法读取流中的数据,也就无法导出流中的数据了。