导入NPOI的全部dll。
因为NPOI的API里面还没有对于Chart图表方面的操作,所以只能根据提示做好的图表作为模板,修改数据源的方法来改变图表。
注意:NPOI要用2003版以下的excel才能更好的支持,对才2007版以上的,导出来图表会变形。
一、制作好一个excel模板
二、读取模板填充数据源
1.给NPOI扩展两个方法,以免下面代码中进行过多的判断
/// <summary> /// 扩展方法 /// </summary> public static class ExtFunction { public static ICell Cell(this IRow row,int index) { ICell cell = row.GetCell(index); if (cell == null) { cell = row.CreateCell(index); } return cell; } public static IRow Row(this ISheet sheet,int index) { IRow row = sheet.GetRow(index); if (row == null) { row = sheet.CreateRow(index); } return row; } }
2.主要代码:
//导出excel private void btnExportExcel_Click(object sender, EventArgs e) { try { string filePath = string.Empty; HSSFWorkbook workbook = null; ISheet sheet1 = null; IRow row = null; int nowRowNum = 1;//当前行2,表头第一行 if (diskInfos.Count < 1) { MessageBox.Show("没有数据"); return; } //选择文件保存路径 filePath = getFilePath(); if (filePath == "") { return; } //模板路径 string excelTempPath = System.Environment.CurrentDirectory + "/temp.xls"; //读取Excel模板 using (FileStream fs = new FileStream(excelTempPath, FileMode.Open, FileAccess.Read)) { workbook = new HSSFWorkbook(fs); } //获取sheet1 sheet1 = workbook.GetSheetAt(0); for (int i = 0; i < diskInfos.Count; i++) { //获取当前行 row = sheet1.Row(nowRowNum); //给行的单元格填充数据 row.Cell(0).SetCellValue(diskInfos[i].IP); row.Cell(1).SetCellValue(diskInfos[i].DiskName); row.Cell(2).SetCellValue(diskInfos[i].FreeSize); row.Cell(3).SetCellValue(diskInfos[i].AllSize); row.Cell(5).SetCellValue(diskInfos[i].Remark); nowRowNum++; } //保存文件 using (Stream stream = File.OpenWrite(filePath)) { workbook.Write(stream); } //弹出消息框 MsgForm msgForm = new MsgForm(filePath); msgForm.ShowDialog(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //弹出选择保存的路径 public string getFilePath() { string filePath = ""; SaveFileDialog sfd=new SaveFileDialog (); //文件类型限制 sfd.Filter = "Files|*.xls"; //默认文件名 sfd.FileName = "DiskReport.xls"; if (sfd.ShowDialog() == DialogResult.OK) { filePath = sfd.FileName; } return filePath; }
功能为查询公司几个服务器的磁盘使用情况,最后导出的excel表为: