[Introduction] NPOI
NPOI is a .NET version of POI project. POI is an open source Java to read and write Excel, WORD and other project components Microsoft OLE2 documents.
Use NPOI you can read and write to WORD / EXCEL documents on the machine is not installed Office or the appropriate environment. NPOI is built on top of POI 3.x versions, which can read and write to Word / Excel documents without installing Office.
NPOI official tutorial Address: http://tonyqus.sinaapp.com
googlecode:http://code.google.com/p/npoi/
codeplex:http://npoi.codeplex.com/
Excel helper class:
1 using System;
2 using System.Data;
3 using System.IO;
4 using System.Text;
5 using System.Web;
6 using NPOI.HPSF;
7 using NPOI.HSSF.UserModel;
8 using NPOI.SS.UserModel;
9 using System.Collections.Generic;
10 using System.Collections;
11 namespace Weilog.Core.Document.Excel
12 {
13 /// <summary>
14 /// Excel 助手类。
15 /// </summary>
16 public class ExcelHelper
17 {
18
19 private void InitializeWorkbook(HSSFWorkbook hssfworkbook, string headerText)
20 {
21 hssfworkbook = new HSSFWorkbook();
22
23 //创建一个文档摘要信息实体。
24 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
25 dsi.Company = "Weilog Team"; //公司名称
26 hssfworkbook.DocumentSummaryInformation = dsi;
27
28 //创建一个摘要信息实体。
29 SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
30 si.Subject = "Weilog 系统生成";
31 si.Author = "Weilog 系统";
32 si.Title = headerText;
33 si.Subject = headerText;
34 si.CreateDateTime = DateTime.Now;
35 hssfworkbook.SummaryInformation = si;
36
37 }
38
39 private static MemoryStream WriteToStream(HSSFWorkbook hssfworkbook)
40 {
41 //Write the stream data of workbook to the root directory
42 MemoryStream file = new MemoryStream();
43 hssfworkbook.Write(file);
44 return file;
45 }
46 //Export(DataTable table, string headerText, string sheetName, string[] columnName, string[] columnTitle)
47 /// <summary>
48 /// 向客户端输出文件。
49 /// </summary>
50 /// <param name="table">数据表。</param>
51 /// <param name="headerText">头部文本。</param>
52 /// <param name="sheetName"></param>
53 /// <param name="columnName">数据列名称。</param>
54 /// <param name="columnTitle">表标题。</param>
55 /// <param name="fileName">文件名称。</param>
56 public static void Write(DataTable table, string headerText, string sheetName, string[] columnName, string[] columnTitle, string fileName)
57 {
58 HttpContext context = HttpContext.Current;
59 context.Response.ContentType = "application/vnd.ms-excel";
60 context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}",HttpUtility.UrlEncode(fileName, Encoding.UTF8)));
61 context.Response.Clear();
62 HSSFWorkbook hssfworkbook = GenerateData(table, headerText, sheetName, columnName, columnTitle);
63 context.Response.BinaryWrite(WriteToStream(hssfworkbook).GetBuffer());
64 context.Response.End();
65 }
66 /// <summary>
67 ///
68 /// </summary>
69 /// <param name="table"></param>
70 /// <param name="headerText"></param>
71 /// <param name="sheetName"></param>
72 /// <param name="columnName"></param>
73 /// <param name="columnTitle"></param>
74 /// <returns></returns>
75 public static HSSFWorkbook GenerateData(DataTable table, string headerText, string sheetName, string[] columnName, string[] columnTitle)
76 {
77 HSSFWorkbook hssfworkbook = new HSSFWorkbook();
78 ISheet sheet = hssfworkbook.CreateSheet(sheetName);
79
80 #region 设置文件属性信息
81
82 //创建一个文档摘要信息实体。
83 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
84 dsi.Company = "Weilog Team"; //公司名称
85 hssfworkbook.DocumentSummaryInformation = dsi;
86
87 //创建一个摘要信息实体。
88 SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
89 si.Subject = "本文档由 Weilog 系统生成";
90 si.Author = " Weilog 系统";
91 si.Title = headerText;
92 si.Subject = headerText;
93 si.CreateDateTime = DateTime.Now;
94 hssfworkbook.SummaryInformation = si;
95
96 #endregion
97
98 ICellStyle dateStyle = hssfworkbook.CreateCellStyle();
99 IDataFormat format = hssfworkbook.CreateDataFormat();
100 dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
101
102 #region 取得列宽
103
104 int[] colWidth = new int[columnName.Length];
105 for (int i = 0; i < columnName.Length; i++)
106 {
107 colWidth[i] = Encoding.GetEncoding(936).GetBytes(columnTitle[i]).Length;
108 }
109 for (int i = 0; i < table.Rows.Count; i++)
110 {
111 for (int j = 0; j < columnName.Length; j++)
112 {
113 int intTemp = Encoding.GetEncoding(936).GetBytes(table.Rows[i][columnName[j]].ToString()).Length;
114 if (intTemp > colWidth[j])
115 {
116 colWidth[j] = intTemp;
117 }
118 }
119 }
120
121 #endregion
122
123 int rowIndex = 0;
124 foreach (DataRow row in table.Rows)
125 {
126 #region 新建表,填充表头,填充列头,样式
127 if (rowIndex == 65535 || rowIndex == 0)
128 {
129 if (rowIndex != 0)
130 {
131 sheet = hssfworkbook.CreateSheet(sheetName + ((int)rowIndex / 65535).ToString());
132 }
133
134 #region 表头及样式
135 //if (!string.IsNullOrEmpty(headerText))
136 {
137 IRow headerRow = sheet.CreateRow(0);
138 headerRow.HeightInPoints = 25;
139 headerRow.CreateCell(0).SetCellValue(headerText);
140
141 ICellStyle headStyle = hssfworkbook.CreateCellStyle();
142 headStyle.Alignment = HorizontalAlignment.CENTER;
143 IFont font = hssfworkbook.CreateFont();
144 font.FontHeightInPoints = 20;
145 font.Boldweight = 700;
146 headStyle.SetFont(font);
147
148 headerRow.GetCell(0).CellStyle = headStyle;
149 //sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
150 sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, table.Columns.Count - 1));
151 }
152 #endregion
153
154 #region 列头及样式
155 {
156 //HSSFRow headerRow = sheet.CreateRow(1);
157 IRow headerRow;
158 //if (!string.IsNullOrEmpty(headerText))
159 //{
160 // headerRow = sheet.CreateRow(0);
161 //}
162 //else
163 //{
164 headerRow = sheet.CreateRow(1);
165 //}
166 ICellStyle headStyle = hssfworkbook.CreateCellStyle();
167 headStyle.Alignment = HorizontalAlignment.CENTER;
168 IFont font = hssfworkbook.CreateFont();
169 font.FontHeightInPoints = 10;
170 font.Boldweight = 700;
171 headStyle.SetFont(font);
172
173 for (int i = 0; i < columnName.Length; i++)
174 {
175 headerRow.CreateCell(i).SetCellValue(columnTitle[i]);
176 headerRow.GetCell(i).CellStyle = headStyle;
177 //设置列宽
178 if ((colWidth[i] + 1) * 256 > 30000)
179 {
180 sheet.SetColumnWidth(i, 10000);
181 }
182 else
183 {
184 sheet.SetColumnWidth(i, (colWidth[i] + 1) * 256);
185 }
186 }
187 /*
188 foreach (DataColumn column in dtSource.Columns)
189 {
190 headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
191 headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
192
193 //设置列宽
194 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
195 }
196 * */
197 }
198 #endregion
199 //if (!string.IsNullOrEmpty(headerText))
200 //{
201 // rowIndex = 1;
202 //}
203 //else
204 //{
205 rowIndex = 2;
206 //}
207
208 }
209 #endregion
210
211 #region 填充数据
212
213 IRow dataRow = sheet.CreateRow(rowIndex);
214 for (int i = 0; i < columnName.Length; i++)
215 {
216 ICell newCell = dataRow.CreateCell(i);
217
218 string drValue = row[columnName[i]].ToString();
219
220 switch (table.Columns[columnName[i]].DataType.ToString())
221 {
222 case "System.String"://字符串类型
223 if (drValue.ToUpper() == "TRUE")
224 newCell.SetCellValue("是");
225 else if (drValue.ToUpper() == "FALSE")
226 newCell.SetCellValue("否");
227 newCell.SetCellValue(drValue);
228 break;
229 case "System.DateTime"://日期类型
230 DateTime dateV;
231 DateTime.TryParse(drValue, out dateV);
232 newCell.SetCellValue(dateV);
233
234 newCell.CellStyle = dateStyle;//格式化显示
235 break;
236 case "System.Boolean"://布尔型
237 bool boolV = false;
238 bool.TryParse(drValue, out boolV);
239 if (boolV)
240 newCell.SetCellValue("是");
241 else
242 newCell.SetCellValue("否");
243 break;
244 case "System.Int16"://整型
245 case "System.Int32":
246 case "System.Int64":
247 case "System.Byte":
248 int intV = 0;
249 int.TryParse(drValue, out intV);
250 newCell.SetCellValue(intV);
251 break;
252 case "System.Decimal"://浮点型
253 case "System.Double":
254 double doubV = 0;
255 double.TryParse(drValue, out doubV);
256 newCell.SetCellValue(doubV);
257 break;
258 case "System.DBNull"://空值处理
259 newCell.SetCellValue("");
260 break;
261 default:
262 newCell.SetCellValue("");
263 break;
264 }
265
266 }
267
268 #endregion
269
270 rowIndex++;
271 }
272
273 return hssfworkbook;
274 }
275 }
276 }
Use of the process needs to be converted into a collection of entity objects DataTable
Instructions:
1 #region 将指定的集合转换成数据表...
2
3 /// <summary>
4 /// 将指定的集合转换成DataTable。
5 /// </summary>
6 /// <param name="list">将指定的集合。</param>
7 /// <returns>返回转换后的DataTable。</returns>
8 public static DataTable ListToDataTable(IList list)
9 {
10 DataTable table = new DataTable();
11 if (list.Count > 0)
12 {
13 PropertyInfo[] propertys = list[0].GetType().GetProperties();
14 foreach (PropertyInfo pi in propertys)
15 {
16 Type pt = pi.PropertyType;
17 if ((pt.IsGenericType) && (pt.GetGenericTypeDefinition() == typeof(Nullable<>)))
18 {
19 pt = pt.GetGenericArguments()[0];
20 }
21 table.Columns.Add(new DataColumn(pi.Name, pt));
22 }
23
24 for (int i = 0; i < list.Count; i++)
25 {
26 ArrayList tempList = new ArrayList();
27 foreach (PropertyInfo pi in propertys)
28 {
29 object obj = pi.GetValue(list[i], null);
30 tempList.Add(obj);
31 }
32 object[] array = tempList.ToArray();
33 table.LoadDataRow(array, true);
34 }
35 }
36 return table;
37 }
38
39 #endregion
40
41 #region 导出数据...
42
43 private void ExportData(List<ProductInfo> productList)
44 {
45 var exportDataList =
46 (from productInfo in ProductList
47 new
48 {
49 Code = productInfo.Code,
50 Name = productInfo.Name,
51 DeptName = productInfo.DeptName,
52 ProjectName = productInfo.ProjectName,
53 CategoryName = productInfo.CategoryName,
54 Intro = productInfo.Intro,
55 Level = productInfo.Level,
56 Objective = productInfo.Objective
57 }).ToList();
58
59 DataTable table = ListToDataTable(exportDataList);
60 string[] strFields = { "Code", "Name", "DeptName", "ProjectName", "CategoryName", "Intro", "Level", "Objective" };
61 string[] strFieldsName = { "编码", "名称", "所属部门", "所属项目", "分类", "简介", "等级", "目标" };
62 ExcelHelper.Write(table, "产品表", "产品表", strFields, strFieldsName, "产品表.xls");
63 }
64
65 #endregion
Reproduced in: https: //my.oschina.net/weisenz/blog/200653