npoi 导出excel

首先用Vs自带的Nuget包管理器下载并安装npoi 2.0,如果没有NuGet程序包选项,在菜单-->工具-->扩展管理器中搜索NuGet。

然后写一个方法读取DataTable中的内容,并输出到MemoryStream中

这是我的NPOIHelper

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Data;
  6 using System.IO;
  7 using NPOI.HSSF.UserModel;
  8 using NPOI.HPSF;
  9 using System.Text;
 10 using NPOI.SS.Util;
 11 using NPOI.SS.UserModel;
 12 
 13 /// <summary>
 14 ///NPOIHelper 的摘要说明
 15 /// </summary>
 16 public static class NPOIHelper
 17 {
 18 public static HSSFWorkbook workbook; 
 19 public static void CloseWorkBook()
 20 {
 21 workbook = null;
 22 }
 23 public static void OpenWorkBook() {
 24 workbook = new HSSFWorkbook();
 25 }
 26 /// <summary>
 27 /// DataTable导出到Excel的MemoryStream
 28 /// </summary>
 29 /// <param name="dtSource">源DataTable</param>
 30 /// <param name="strHeaderText">表头文本</param>
 31 public static void Export(DataTable dtSource, string strHeaderText) {
 32 
 33 HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
 34 
 35 #region 右击文件 属性信息
 36 {
 37 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
 38 dsi.Company = "北京通信科技有限公司";
 39 workbook.DocumentSummaryInformation = dsi;
 40 
 41 SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
 42 //si.Author = "文件作者信息"; //填加xls文件作者信息
 43 //si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息
 44 //si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息
 45 //si.Comments = "作者信息"; //填加xls文件作者信息
 46 //si.Title = "标题信息"; //填加xls文件标题信息
 47 //si.Subject = "主题信息";//填加文件主题信息
 48 si.CreateDateTime = DateTime.Now;
 49 workbook.SummaryInformation = si;
 50 }
 51 #endregion
 52 
 53 HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();
 54 HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat();
 55 dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
 56 
 57 HSSFCellStyle tdStyle = (HSSFCellStyle)workbook.CreateCellStyle();
 58 //设置单元格边框 
 59 tdStyle.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
 60 tdStyle.BorderBottom = BorderStyle.THIN;
 61 tdStyle.BorderLeft = BorderStyle.THIN;
 62 tdStyle.BorderRight = BorderStyle.THIN;
 63 tdStyle.BorderTop = BorderStyle.THIN;
 64 //取得列宽
 65 int[] arrColWidth = new int[dtSource.Columns.Count];
 66 foreach (DataColumn item in dtSource.Columns) {
 67 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
 68 }
 69 for (int i = 0; i < dtSource.Rows.Count; i++) {
 70 for (int j = 0; j < dtSource.Columns.Count; j++) {
 71 int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
 72 if (intTemp > arrColWidth[j]) {
 73 arrColWidth[j] = intTemp;
 74 }
 75 }
 76 }
 77 int rowIndex = 0;
 78 foreach (DataRow row in dtSource.Rows) {
 79 #region 新建表,填充表头,填充列头,样式
 80 if (rowIndex == 65535 || rowIndex == 0) {
 81 if (rowIndex != 0) {
 82 sheet = (HSSFSheet)workbook.CreateSheet();
 83 }
 84 
 85 #region 表头及样式
 86 {
 87 HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);
 88 headerRow.HeightInPoints = 25;
 89 headerRow.CreateCell(0).SetCellValue(strHeaderText);
 90 
 91 HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
 92 headStyle.Alignment = HorizontalAlignment.CENTER;
 93 HSSFFont font = (HSSFFont)workbook.CreateFont();
 94 
 95 font.FontHeightInPoints = 20;
 96 font.Boldweight = 700;
 97 headStyle.SetFont(font);
 98 headerRow.GetCell(0).CellStyle = headStyle;
 99 sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
100 //headerRow.Dispose();
101 }
102 #endregion
103 
104 
105 #region 列头及样式
106 {
107 HSSFRow headerRow = (HSSFRow)sheet.CreateRow(1);
108 HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
109 headStyle.Alignment = HorizontalAlignment.CENTER;
110 HSSFFont font = (HSSFFont)workbook.CreateFont();
111 //设置单元格边框 
112 headStyle.BorderBottom = BorderStyle.THIN;
113 headStyle.BorderLeft = BorderStyle.THIN;
114 headStyle.BorderRight = BorderStyle.THIN;
115 headStyle.BorderTop = BorderStyle.THIN;
116 
117 font.FontHeightInPoints = 10;
118 font.Boldweight = 700;
119 headStyle.SetFont(font);
120 foreach (DataColumn column in dtSource.Columns) {
121 headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
122 headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
123 
124 //设置列宽
125 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
126 }
127 //headerRow.Dispose();
128 }
129 #endregion
130 
131 rowIndex = 2;
132 }
133 #endregion
134 
135 
136 #region 填充内容
137 HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
138 foreach (DataColumn column in dtSource.Columns) {
139 HSSFCell newCell = (HSSFCell)dataRow.CreateCell(column.Ordinal);
140 newCell.CellStyle = tdStyle;
141 
142 string drValue = row[column].ToString();
143 switch (column.DataType.ToString()) {
144 case "System.String"://字符串类型
145 newCell.SetCellValue(drValue);
146 break;
147 case "System.DateTime"://日期类型
148 DateTime dateV;
149 DateTime.TryParse(drValue, out dateV);
150 newCell.SetCellValue(dateV);
151 
152 newCell.CellStyle = dateStyle;//格式化显示
153 break;
154 case "System.Boolean"://布尔型
155 bool boolV = false;
156 bool.TryParse(drValue, out boolV);
157 newCell.SetCellValue(boolV);
158 break;
159 case "System.Int16"://整型
160 case "System.Int32":
161 case "System.Int64":
162 case "System.Byte":
163 int intV = 0;
164 int.TryParse(drValue, out intV);
165 newCell.SetCellValue(intV);
166 break;
167 case "System.Decimal"://浮点型
168 case "System.Double":
169 double doubV = 0;
170 double.TryParse(drValue, out doubV);
171 newCell.SetCellValue(doubV);
172 break;
173 case "System.DBNull"://空值处理
174 newCell.SetCellValue("");
175 break;
176 default:
177 newCell.SetCellValue("");
178 break;
179 }
180 
181 }
182 #endregion
183 
184 rowIndex++;
185 }
186 using (MemoryStream ms = new MemoryStream()) {
187 workbook.Write(ms);
188 }
189 }
190 
191 public static MemoryStream Export2(DataTable dt, string p) {
192 Export(dt,p);
193 MemoryStream ms = new MemoryStream();
194 ISheet sheet=workbook.GetSheet("Sheet1");
195 int FirstRow=2;
196 int LastRow=sheet.LastRowNum;
197 int Start=0;
198 int End=0;
199 string temp = "";
200 HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();
201 dateStyle.Alignment = HorizontalAlignment.RIGHT;
202 dateStyle.VerticalAlignment = VerticalAlignment.CENTER;
203 for (int i = FirstRow; i < LastRow; i++) {
204 for (int j = 1; j < 5; j++) {
205 if (j == 1)
206 {
207 IRow row=sheet.GetRow(i);
208 if (row == null) continue; //没有数据的行默认是null
209 if (row.GetCell(j) == null){continue;} //同理,没有数据的单元格都默认是null
210 ICell cell=row.GetCell(j);
211 string cellText=cell.StringCellValue;
212 if (cellText == temp)//上下行相等,记录要合并的最后一行
213 {
214 End = i;
215 }
216 else//上下行不等,记录
217 {
218 if (Start != End) {
219 for (int n = Start; n < End; n++) {
220 ICell tempcell=sheet.GetRow(n).GetCell(2);
221 tempcell.SetCellValue(""+( End-Start+1 ));
222 tempcell.CellStyle = dateStyle;
223 }
224 for (int m = 1; m < 5; m++) {
225 CellRangeAddress region = new CellRangeAddress(Start, End, m,m);
226 sheet.AddMergedRegion(region);
227 }
228 
229 }
230 Start = i;
231 End = i;
232 temp = cellText;
233 }
234 }
235 
236 }
237 }
238 workbook.Write(ms);
239 return ms;
240 }
241 }
NPOIHelper

 使用方法是:

NPOIHelper.OpenWorkBook();
DataTable dt=EconomicHelper4.GetSumProjectManager();
NPOIHelper.Export(dt,“管理");                          //Export1用于生成DataTable
DataTable dt2 = EconomicHelper4.GetExtensionProjectManager();
MemoryStream ms = NPOIHelper.Export2(dt2, "数据");            //Export2用于合并单元格  
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls", DateTime.Now.ToString("yyyyMMddHHmmssfff")));
Response.BinaryWrite(ms.ToArray());
ms.Close();
ms.Dispose();
NPOIHelper.CloseWorkBook();

posted @ 2016-02-25 09:15  、朔风  阅读(480)  评论(3编辑  收藏  举报