(C#)使用NPOI导出Excel
在做业务型的软件时,经常需要将某些数据导出,本文介绍了在Winform或Asp.net中使用NPOI(POI 项目的 .NET 版本)来操作Excel文件,而无需安装Office。
首先,需要获取NPOI组件。
其次,让你的网站或类库添加NPOI引用。对于导出导入Excel来说,需要引用的dll文件有:
NPOI.dll,NPOI.HSSF.dll,NPOI.POIFS.dll
最后,在网站或类库中新建一个导出帮助类,例如命名为ExcelHelper.cs
ExcelHelper.cs
public class ExportHelper { public static Stream RenderDataTableToExcel(DataTable SourceTable) { HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); HSSFSheet sheet = workbook.CreateSheet(); HSSFRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in SourceTable.Columns) headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); // handling value. int rowIndex = 1; foreach (DataRow row in SourceTable.Rows) { HSSFRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in SourceTable.Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position = 0; sheet = null; headerRow = null; workbook = null; return ms; } public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex) { HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream); HSSFSheet sheet = workbook.GetSheetAt(SheetIndex); DataTable table = new DataTable(); HSSFRow headerRow = sheet.GetRow(HeaderRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } int rowCount = sheet.LastRowNum; for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { HSSFRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) dataRow[j] = row.GetCell(j).ToString(); } table.Rows.Add(dataRow); } ExcelFileStream.Close(); workbook = null; sheet = null; return table; } }
在方法中调用ExcelHelper:
示例1:导出Excel:
protected void exportExcelFun(){ DataTable dt=new DataTable(); dt=XXXXX;//Use ADO.NET to get Data from DB MemoryStream ms = ExportHelper.RenderDataTableToExcel(dt) as MemoryStream; /*情况1:在Asp.NET中,输出文件流,浏览器自动提示下载*/ Response.AddHeader("Content-Disposition", string.Format("attachment; filename=download.xls")); Response.BinaryWrite(ms.ToArray()); ms.Close(); ms.Dispose(); /*情况2:在Winform中,弹出SaveFileDialog,提示用户选择文件放置位置。*/ string saveFileName = ""; bool fileSaved = false; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "xls"; saveDialog.Filter = "Excel文件|*.xls"; saveDialog.FileName = "download"; saveDialog.ShowDialog(); saveFileName = saveDialog.FileName; if (saveFileName.IndexOf(":") < 0) return; //被点了取消 if (saveFileName != ""){ try{ FileStream fs = new FileStream(saveDialog.FileName, FileMode.Create); fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); ms.Close(); ms.Dispose(); fs.Close(); fileSaved = true; } catch (Exception ex){ fileSaved = false; MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message); } } else{ fileSaved = false; } GC.Collect();//强行销毁 if (fileSaved && File.Exists(saveFileName)){ MessageBox.Show("导出成功!", "通知"); } else { MessageBox.Show("导出失败!", "通知"); } }
示例2:导入Excel
protected void importExcelFun(){ /*情况1:在Asp.net网站,一般使用asp:FileUpLoad控件(实际上是一个HTML表单.input:type=file)上传文件*/ if(this.FileUpLoader.HasFile){ DataTable dt=new DataTable();
//设置第1行为标题行,从第二行开始读取数据。标题行作为DataTable表头。 dt=ExcelHelper.RenderDataTableFromExcel(this.FileUpLoader.FileContent,0,0);
//use dt to do something } /*情况2:在Winform中,*/ OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Filter = "Excel文件|*.xls"; fileDialog.InitialDirectory = "E:\\";//设置默认打开路径 if (fileDialog.ShowDialog() == DialogResult.OK){ string fileName=fileDialog.FileName;//得到文件所在位置。
// use c# to read Excel File as Steam.
// use ExcelHelper for converting Stream to DataTable. } }
有的工具或方式导出的Excel文件非标准文件,只可用于阅读,而无法进行其它业务操作。
而使用NPOI导出的Excel文件均为标准格式,与Windows下人工创建的Excel文件完全一致。
(完)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?