NPOI导出Excel表功能实现(多个工作簿)(备用)
Excel生成操作类:
1 代码 2 using System; 3 using System.Collections.Generic; 4 using System.Text; 5 using System.IO; 6 using NPOI; 7 using NPOI.HPSF; 8 using NPOI.HSSF; 9 using NPOI.HSSF.UserModel; 10 using System.Data; 11 12 namespace StarTech.NPOI 13 { 14 /// <summary> 15 /// Excel生成操作类 16 /// </summary> 17 public class NPOIHelper 18 { 19 /// <summary> 20 /// 导出列名 21 /// </summary> 22 public static System.Collections.SortedList ListColumnsName; 23 /// <summary> 24 /// 导出Excel 25 /// </summary> 26 /// <param name="dgv"></param> 27 /// <param name="filePath"></param> 28 public static void ExportExcel(DataTable dtSource, string filePath) 29 { 30 if (ListColumnsName == null || ListColumnsName.Count == 0) 31 throw (new Exception("请对ListColumnsName设置要导出的列明!")); 32 33 HSSFWorkbook excelWorkbook = CreateExcelFile(); 34 InsertRow(dtSource, excelWorkbook); 35 SaveExcelFile(excelWorkbook, filePath); 36 } 37 /// <summary> 38 /// 导出Excel 39 /// </summary> 40 /// <param name="dgv"></param> 41 /// <param name="filePath"></param> 42 public static void ExportExcel(DataTable dtSource, Stream excelStream) 43 { 44 if (ListColumnsName == null || ListColumnsName.Count == 0) 45 throw (new Exception("请对ListColumnsName设置要导出的列明!")); 46 47 HSSFWorkbook excelWorkbook = CreateExcelFile(); 48 InsertRow(dtSource, excelWorkbook); 49 SaveExcelFile(excelWorkbook, excelStream); 50 } 51 /// <summary> 52 /// 保存Excel文件 53 /// </summary> 54 /// <param name="excelWorkBook"></param> 55 /// <param name="filePath"></param> 56 protected static void SaveExcelFile(HSSFWorkbook excelWorkBook, string filePath) 57 { 58 FileStream file = null; 59 try 60 { 61 file = new FileStream(filePath, FileMode.Create); 62 excelWorkBook.Write(file); 63 } 64 finally 65 { 66 if (file != null) 67 { 68 file.Close(); 69 } 70 } 71 } 72 /// <summary> 73 /// 保存Excel文件 74 /// </summary> 75 /// <param name="excelWorkBook"></param> 76 /// <param name="filePath"></param> 77 protected static void SaveExcelFile(HSSFWorkbook excelWorkBook, Stream excelStream) 78 { 79 try 80 { 81 excelWorkBook.Write(excelStream); 82 } 83 finally 84 { 85 86 } 87 } 88 /// <summary> 89 /// 创建Excel文件 90 /// </summary> 91 /// <param name="filePath"></param> 92 protected static HSSFWorkbook CreateExcelFile() 93 { 94 HSSFWorkbook hssfworkbook = new HSSFWorkbook(); 95 return hssfworkbook; 96 } 97 /// <summary> 98 /// 创建excel表头 99 /// </summary> 100 /// <param name="dgv"></param> 101 /// <param name="excelSheet"></param> 102 protected static void CreateHeader(HSSFSheet excelSheet) 103 { 104 int cellIndex = 0; 105 //循环导出列 106 foreach (System.Collections.DictionaryEntry de in ListColumnsName) 107 { 108 HSSFRow newRow = excelSheet.CreateRow(0); 109 HSSFCell newCell = newRow.CreateCell(cellIndex); 110 newCell.SetCellValue(de.Value.ToString()); 111 cellIndex++; 112 } 113 } 114 /// <summary> 115 /// 插入数据行 116 /// </summary> 117 protected static void InsertRow(DataTable dtSource, HSSFWorkbook excelWorkbook) 118 { 119 int rowCount = 0; 120 int sheetCount = 1; 121 HSSFSheet newsheet = null; 122 123 //循环数据源导出数据集 124 newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount); 125 CreateHeader(newsheet); 126 foreach (DataRow dr in dtSource.Rows) 127 { 128 rowCount++; 129 //超出10000条数据 创建新的工作簿 130 if (rowCount == 10000) 131 { 132 rowCount = 1; 133 sheetCount++; 134 newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount); 135 CreateHeader(newsheet); 136 } 137 138 HSSFRow newRow = newsheet.CreateRow(rowCount); 139 InsertCell(dtSource, dr, newRow, newsheet, excelWorkbook); 140 } 141 } 142 /// <summary> 143 /// 导出数据行 144 /// </summary> 145 /// <param name="dtSource"></param> 146 /// <param name="drSource"></param> 147 /// <param name="currentExcelRow"></param> 148 /// <param name="excelSheet"></param> 149 /// <param name="excelWorkBook"></param> 150 protected static void InsertCell(DataTable dtSource, DataRow drSource, HSSFRow currentExcelRow, HSSFSheet excelSheet, HSSFWorkbook excelWorkBook) 151 { 152 for (int cellIndex = 0; cellIndex < ListColumnsName.Count; cellIndex++) 153 { 154 //列名称 155 string columnsName = ListColumnsName.GetKey(cellIndex).ToString(); 156 HSSFCell newCell = null; 157 System.Type rowType = drSource[columnsName].GetType(); 158 string drValue = drSource[columnsName].ToString().Trim(); 159 switch (rowType.ToString()) 160 { 161 case "System.String"://字符串类型 162 drValue = drValue.Replace("&", "&"); 163 drValue = drValue.Replace(">", ">"); 164 drValue = drValue.Replace("<", "<"); 165 newCell = currentExcelRow.CreateCell(cellIndex); 166 newCell.SetCellValue(drValue); 167 break; 168 case "System.DateTime"://日期类型 169 DateTime dateV; 170 DateTime.TryParse(drValue, out dateV); 171 newCell = currentExcelRow.CreateCell(cellIndex); 172 newCell.SetCellValue(dateV); 173 174 //格式化显示 175 HSSFCellStyle cellStyle = excelWorkBook.CreateCellStyle(); 176 HSSFDataFormat format = excelWorkBook.CreateDataFormat(); 177 cellStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm:ss"); 178 newCell.CellStyle = cellStyle; 179 180 break; 181 case "System.Boolean"://布尔型 182 bool boolV = false; 183 bool.TryParse(drValue, out boolV); 184 newCell = currentExcelRow.CreateCell(cellIndex); 185 newCell.SetCellValue(boolV); 186 break; 187 case "System.Int16"://整型 188 case "System.Int32": 189 case "System.Int64": 190 case "System.Byte": 191 int intV = 0; 192 int.TryParse(drValue, out intV); 193 newCell = currentExcelRow.CreateCell(cellIndex); 194 newCell.SetCellValue(intV.ToString()); 195 break; 196 case "System.Decimal"://浮点型 197 case "System.Double": 198 double doubV = 0; 199 double.TryParse(drValue, out doubV); 200 newCell = currentExcelRow.CreateCell(cellIndex); 201 newCell.SetCellValue(doubV); 202 break; 203 case "System.DBNull"://空值处理 204 newCell = currentExcelRow.CreateCell(cellIndex); 205 newCell.SetCellValue(""); 206 break; 207 default: 208 throw (new Exception(rowType.ToString() + ":类型数据无法处理!")); 209 } 210 } 211 } 212 } 213 //排序实现接口 不进行排序 根据添加顺序导出 214 public class NoSort : System.Collections.IComparer 215 { 216 public int Compare(object x, object y) 217 { 218 return -1; 219 } 220 } 221 }
调用方法:
1 代码 2 //导出数据列 实现根据添加顺序导出列 3 StarTech.NPOI.NPOIHelper.ListColumnsName = new SortedList(new StarTech.NPOI.NoSort()); 4 StarTech.NPOI.NPOIHelper.ListColumnsName.Add("MemberName", "姓名"); 5 StarTech.NPOI.NPOIHelper.ListColumnsName.Add("username", "账号"); 6 StarTech.NPOI.NPOIHelper.ListColumnsName.Add("starttime", "登陆时间"); 7 StarTech.NPOI.NPOIHelper.ListColumnsName.Add("lasttime", "在线到期时间"); 8 StarTech.NPOI.NPOIHelper.ListColumnsName.Add("state", "状态"); 9 Response.Clear(); 10 Response.BufferOutput = false; 11 Response.ContentEncoding = System.Text.Encoding.UTF8; 12 string filename = HttpUtility.UrlEncode(DateTime.Now.ToString("在线用户yyyyMMdd")); 13 Response.AddHeader("Content-Disposition", "attachment;filename=" + filename + ".xls"); 14 Response.ContentType = "application/ms-excel"; 15 StarTech.NPOI.NPOIHelper.ExportExcel(dtSource, Response.OutputStream); 16 Response.Close();
屌丝一直很屌