如今不少公司用的导出基本上采用的经过gridView导出excel,此种导出存在如下几种问题html
一、数据量大的时候有时导出有时会让浏览器卡死,由于导出的excel不是真正的excel,是html格式的,只是用excel打开,查看方式只需用记事本或其余文本编辑器打开就好了。sql
二、 因为导出的是html,用excel打开,会出现如下两个问题:一、因此导出的数据都会弹出一个提示框,“您尝试打开的文件的格式与文件扩展名指定 格式不一致,打开文件前请验证文件没有损坏且来源可信”的对话框二、当修改里面的内容时只能保存一个副本操做及其不方便。三、并且html格式的文档导入 也会存在很大的问题。浏览器
一、NPOI导出2007格式和2010格式的很慢,几万数据极可能会卡死。服务器
NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。app
使用 NPOI 你就能够在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它能够在没有安装Office的状况下对 Word/Excel文档进行读写操做框架
2.2 NPOI优点xss
(一)传统操做Excel遇到的问题:编辑器
一、若是是.NET,须要在服务器端装Office,且及时更新它,以防漏洞,还须要设定权限容许.NET访问COM+,若是在导出过程当中出问题可能致使服务器宕机。ui
二、Excel会把只包含数字的列进行类型转换,原本是文本型的,Excel会将其转成数值型的,好比编号000123会变成123。this
三、导出时,若是字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。
四、Excel会根据Excel文件前8行分析数据类型,若是正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成相似1.42702E+17格式,日期列变成包含日期和数字的。
五、第二种是直接导出html,修改后缀名为.xls,这个方法有点像骗人的把戏,并且不能再导入
六、第三种是使用Jet OLEDB引擎来进行导入导出,彻底使用sql语句来进行操做,缺点能控制的东西很是有限,好比格式就难以控制
七、第四中CSV格式的文件其实导出的是文本格式的文件,此种格式的文件优势导出方便并且速度快。可是使用者用excel对数据进行分析后须要对数据进行从新存一份。
(二)使用NPOI的优点
一、你不须要在服务器上安装微软的Office,能够避免版权问题。
二、使用起来比Office PIA的API更加方便,更人性化。
三、你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。
NPOI之因此强大,并非由于它支持导出Excel,而是由于它支持导入Excel,并能“理解”OLE2文档结构,这也是其余一些Excel读写库比 较弱的方面。一般,读入并理解结构 远比导出来得复杂,由于导入你必须假设一切状况都是可能的,而生成你只要保证知足你本身需求就能够了,若是把导入需求 和生成需求比作两个集合,那么生成需求一般都是导入需求的子集,这一规律不只体如今Excel读写库中,也体如今pdf读写库中,目前市面上大部分的 pdf库仅支持生成,不支持导入。
四、支持excel07格式和简单的10格式的导入导出
五、支持图片的导入导出
六、导入导出速度很快
2.3 NPOI组件构成
NPOI 2.01,当是.net2.0框架时提供如下使用的dll和配置文件。
一、 ICSharpCode.SharpZipLib.dll
二、 NPOI.dll
三、 NPOI.OOXML.dll
四、 NPOI.OpenXml4Net.dll
五、 NPOI.OpenXml4Net.dll.config
六、 NPOI.OpenXmlFormats.dll
七、 NPOI.XML
若是是.net 3.5框架时提供如下使用的dll和配置文件
一、 ICSharpCode.SharpZipLib.dll
二、 NPOI.dll
三、 NPOI.OOXML.dll
四、 NPOI.OpenXml4Net.dll
五、 NPOI.OpenXml4Net.dll.config
六、 NPOI.OpenXmlFormats.dll
七、 NPOI.XML
若是是.net 4.0框架时提供如下使用的dll和配置文件
一、 ICSharpCode.SharpZipLib.dll
二、 NPOI.dll
三、 NPOI.OOXML.dll
四、 NPOI.OpenXml4Net.dll
五、 NPOI.OpenXmlFormats.dll
六、 NPOI.XML
2.4 如何使用NPOI
2.4.1 使用准备
将新建项目时所使用的.net框架版本和NPOI相对应,而后对全部dll添加引用
2.4.2 NPOI组件dll详细状况
1、NPOI.DLL中包含的模块
NPOI.Util 基础辅助库
NPOI.POIFS OLE2格式读写库,主要负责处理DocumentInformation
NPOI.DDF Microsoft Drawing格式读写库
NPOI.SS Excel 2003和Excel 2007操做库共用的接口库以及公用模块实现,如公式计算库
NPOI.HPSF OLE2的Summary Information和Document Summary Information属性读写库
NPOI.HSSF Excel BIFF格式读写库,这是用户用的最多的命名空间
二、NPOI.OOXML中包含的模块
NPOI.XSSF Excel 2007操做库,大部分对象都实现了NPOI.SS的接口
NPOI.XWPF Word 2007操做库
三、NPOI.OpenXml4Net.DLL中包含的模块
只有一个,即NPOI.OpenXml4Net,它是从POI的子项目OpenXml4j移植过来的,其功能相似于NPOI.POIFS,只是 它操做的是OOXML格式。这个模块和微软提供的 System.Packaging功能是一致的,只是System.Packaging支 持.Net 3.0以上,这个支持.NET 2.0。
四、NPOI.OpenXmlFormats.DLL中包含的模块
也只有一个,即OpenXmlFormats,它定义了全部OOXML对象和C#对象的映射关系,并协助进行序列化和反序列化,从而使文件读写层和逻辑层分离。
一、取数据操做,因为导出的数据量很大,不能一次将数据取到内存中,须要分配的将数据取到内存中
Demo中分批取数据方法
01.
1
BATOStatisticsRPT bllATO =
new
BATOStatisticsRPT();
02.
2
// 因为导出数据量很大 分页服务取得的数据很大因此分批取数据放到DataTable中
03.
3
MyPager pager =
new
MyPager();
04.
4
05.
5
pager.PageSize =
5000
;
//每次取5000条数据
06.
6
07.
7
pager.TotalSize = bllATO.GetRecord();
08.
8
09.
9
int
pageCount = pager.GetPageCount();
10.
10
11.
11
DataTable dt =
new
DataTable();
12.
12
13.
13
for
(
int
i =
0
; i < pageCount; i++)
14.
14
15.
15
{
16.
16
17.
17
DataTable dtTemp =
new
DataTable();
18.
18
19.
19
dtTemp = bllATO.GetDataTable(
""
,
""
, pager.PageSize * i, pager.PageSize * (i +
1
));
20.
20
21.
21
dt.Merge(dtTemp);
22.
22
23.
23
}
24.
24
25.
25
return
dt;
其中有一个简单分页类代码为:
01.
/// <summary>
02.
/// MyPager类
03.
/// </summary>
04.
public
class
MyPager
05.
{
06.
/// <summary>
07.
/// 总条数
08.
/// </summary>
09.
public
int
TotalSize {
get
;
set
; }
10.
11.
/// <summary>
12.
/// 每页数据量
13.
/// </summary>
14.
public
int
PageSize {
get
;
set
; }
15.
16.
/// <summary>
17.
/// 当前页面
18.
/// </summary>
19.
public
int
CurrentPageIndex {
get
;
set
; }
20.
21.
/// <summary>
22.
/// 获得总页数
23.
/// </summary>
24.
/// <returns>总页数</returns>
25.
public
int
GetPageCount()
26.
{
27.
int
totalPageCount;
28.
return
totalPageCount = (
int
)Math.Ceiling((
double
)TotalSize / PageSize);
29.
}
30.
}
3、导出excel2003格式
NPOIHelper.TableToExcelForXLSAny(this.GetDataTable(), "excel2003导出");
NPOIHelPer代码帮助类代码为
001.
/// <summary>
002.
/// NPOIHelper类
003.
/// </summary>
004.
public
class
NPOIHelper
005.
{
006.
#region excel2003超过65535行数据用多个sheet处理
007.
/// <summary>
008.
/// 将DataTable数据导出到Excel文件中(xls) 最大支持65535行
009.
/// </summary>
010.
/// <param name="dt">数据源</param>
011.
/// <param name="excelName">导出文件名称</param>
012.
public
static
void
TableToExcelForXLSAny(DataTable dt,
string
excelName)
013.
{
014.
Stopwatch stopWacth =
new
Stopwatch();
015.
stopWacth.Start();
// 开始计时器
016.
HSSFWorkbook hssfworkbook =
new
HSSFWorkbook();
017.
int
rowCount = dt.Rows.Count;
018.
int
sheetMaxRow = 65535;
019.
020.
//大于65535行数据
021.
if
(rowCount > sheetMaxRow)
022.
{
023.
for
(
int
k = 1; k <= rowCount / sheetMaxRow; k++)
024.
{
025.
ISheet sheet = hssfworkbook.CreateSheet(excelName +
"_"
+ k);
026.
//表头
027.
IRow row = sheet.CreateRow(0);
028.
for
(
int
i = 0; i < dt.Columns.Count; i++)
029.
{
030.
sheet.SetColumnWidth(i, 30 * 180);
// 设置所在列的宽度
031.
ICell cell = row.CreateCell(i);
032.
cell.SetCellValue(dt.Columns[i].ColumnName);
033.
}
034.
035.
int
m = 0;
036.
//数据
037.
for
(
int
i = (k - 1) * sheetMaxRow; i < k * sheetMaxRow; i++)
038.
{
039.
IRow row1 = sheet.CreateRow(m + 1);
040.
for
(
int
j = 0; j < dt.Columns.Count; j++)
041.
{
042.
ICell cell = row1.CreateCell(j);
043.
cell.SetCellValue(dt.Rows[i][j].ToString());
044.
}
045.
m++;
046.
}
047.
}
048.
049.
if
(rowCount % sheetMaxRow != 0)
050.
{
051.
ISheet sheet = hssfworkbook.CreateSheet(excelName +
"_"
+ (rowCount / sheetMaxRow + 1));
052.
//表头
053.
IRow row = sheet.CreateRow(0);
054.
for
(
int
i = 0; i < dt.Columns.Count; i++)
055.
{
056.
sheet.SetColumnWidth(i, 30 * 180);
// 设置所在列的宽度
057.
ICell cell = row.CreateCell(i);
058.
cell.SetCellValue(dt.Columns[i].ColumnName);
059.
}
060.
061.
int
m = 0;
062.
063.
//数据
064.
for
(
int
i = (rowCount / sheetMaxRow) * sheetMaxRow; i < rowCount; i++)
065.
{
066.
067.
IRow row1 = sheet.CreateRow(m + 1);
068.
for
(
int
j = 0; j < dt.Columns.Count; j++)
069.
{
070.
ICell cell = row1.CreateCell(j);
071.
cell.SetCellValue(dt.Rows[i][j].ToString());
072.
}
073.
m++;
074.
}
075.
}
076.
077.
}
078.
079.
// 小于65536行
080.
else
081.
{
082.
ISheet sheet = hssfworkbook.CreateSheet(excelName);
083.
//表头
084.
IRow row = sheet.CreateRow(0);
085.
for
(
int
i = 0; i < dt.Columns.Count; i++)
086.
{
087.
sheet.SetColumnWidth(i, 30 * 180);
// 设置所在列的宽度
088.
ICell cell = row.CreateCell(i);
089.
cell.SetCellValue(dt.Columns[i].ColumnName);
090.
}
091.
092.
//数据
093.
for
(
int
i = 0; i < dt.Rows.Count; i++)
094.
{
095.
IRow row1 = sheet.CreateRow(i + 1);
096.
for
(
int
j = 0; j < dt.Columns.Count; j++)
097.
{
098.
ICell cell = row1.CreateCell(j);
099.
cell.SetCellValue(dt.Rows[i][j].ToString());
100.
}
101.
}
102.
}
103.
104.
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
105.
curContext.Response.Clear();
106.
curContext.Response.ContentType =
"application/x-excel"
;
107.
string
filename = HttpUtility.UrlEncode(excelName + DateTime.Now.ToString(
"yyyyMMddHHmm"
) +
".xls"
);
108.
curContext.Response.AddHeader(
"Content-Disposition"
,
"attachment;filename="
+ filename);
109.
hssfworkbook.Write(curContext.Response.OutputStream);
110.
File.AppendAllText(curContext.Server.MapPath(
"/TestMinutes/TestResult.txt"
),
"\nNPOI获得dataTable后导出数据速度:"
+ stopWacth.ElapsedMilliseconds.ToString()+
"毫秒"
, System.Text.Encoding.UTF8);
111.
stopWacth.Stop();
112.
curContext.Response.End();
113.
}
114.
#endregion
115.
116.
#region Excel2003
117.
/// <summary>
118.
/// 将Excel文件中的数据读出到DataTable中(xls)
119.
/// </summary>
120.
/// <param name="file">文件路径</param>
121.
/// <returns>DataTable</returns>
122.
public
static
DataTable ExcelToTableForXLS(
string
file)
123.
{
124.
DataTable dt =
new
DataTable();
125.
using
(FileStream fs =
new
FileStream(file, FileMode.Open, FileAccess.Read))
126.
{
127.
HSSFWorkbook hssfworkbook =
new
HSSFWorkbook(fs);
128.
ISheet sheet = hssfworkbook.GetSheetAt(0);
129.
130.
//表头
131.
IRow header = sheet.GetRow(sheet.FirstRowNum);
132.
List<
int
> columns =
new
List<
int
>();
133.
for
(
int
i = 0; i < header.LastCellNum; i++)
134.
{
135.
object
obj = GetValueTypeForXLS(header.GetCell(i)
as
HSSFCell);
136.
if
(obj ==
null
|| obj.ToString() ==
string
.Empty)
137.
{
138.
dt.Columns.Add(
new
DataColumn(
"Columns"
+ i.ToString()));
139.
//continue;
140.
}
141.
else
142.
dt.Columns.Add(
new
DataColumn(obj.ToString()));
143.
columns.Add(i);
144.
}
145.
//数据
146.
for
(
int
i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
147.
{
148.
DataRow dr = dt.NewRow();
149.
bool
hasValue =
false
;
150.
foreach
(
int
j
in
columns)
151.
{
152.
dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j)
as
HSSFCell);
153.
if
(dr[j] !=
null
&& dr[j].ToString() !=
string
.Empty)
154.
{
155.
hasValue =
true
;
156.
}
157.
}
158.
if
(hasValue)
159.
{
160.
dt.Rows.Add(dr);
161.
}
162.
}
163.
}
164.
165.
return
dt;
166.
}
167.
168.
/// <summary>
169.
/// 将DataTable数据导出到Excel文件中(xls)
170.
/// </summary>
171.
/// <param name="dt">数据源</param>
172.
/// <param name="excelName">excel名称</param>
173.
public
static
void
TableToExcelForXLS(DataTable dt,
string
excelName)
174.
{
175.
HSSFWorkbook hssfworkbook =
new
HSSFWorkbook();
176.
ISheet sheet = hssfworkbook.CreateSheet(
"Test"
);
177.
178.
//表头
179.
IRow row = sheet.CreateRow(0);
180.
for
(
int
i = 0; i < dt.Columns.Count; i++)
181.
{
182.
ICell cell = row.CreateCell(i);
183.
cell.SetCellValue(dt.Columns[i].ColumnName);
184.
}
185.
186.
//数据
187.
for
(
int
i = 0; i < dt.Rows.Count; i++)
188.
{
189.
IRow row1 = sheet.CreateRow(i + 1);
190.
for
(
int
j = 0; j < dt.Columns.Count; j++)
191.
{
192.
ICell cell = row1.CreateCell(j);
193.
cell.SetCellValue(dt.Rows[i][j].ToString());
194.
}
195.
}
196.
197.
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
198.
curContext.Response.Clear();
199.
curContext.Response.ContentType =
"application/x-excel"
;
200.
string
filename = HttpUtility.UrlEncode(excelName + DateTime.Now.ToString(
"yyyyMMddHHmm"
) +
".xls"
);
201.
curContext.Response.AddHeader(
"Content-Disposition"
,
"attachment;filename="
+ filename);
202.
hssfworkbook.Write(curContext.Response.OutputStream);
203.
curContext.Response.End();
204.
}
205.
206.
/// <summary>
207.
/// 获取单元格类型(xls)
208.
/// </summary>
209.
/// <param name="cell">单元格</param>
210.
/// <returns>单元格类型</returns>
211.
private
static
object
GetValueTypeForXLS(HSSFCell cell)
212.
{
213.
if
(cell ==
null
)
214.
return
null
;
215.
switch
(cell.CellType)
216.
{
217.
case
CellType.BLANK:
//BLANK:
218.
return
null
;
219.
case
CellType.BOOLEAN:
//BOOLEAN:
220.
return
cell.BooleanCellValue;
221.
case
CellType.NUMERIC:
//NUMERIC:
222.
return
cell.NumericCellValue;
223.
case
CellType.STRING:
//STRING:
224.
return
cell.StringCellValue;
225.
case
CellType.ERROR:
//ERROR:
226.
return
cell.ErrorCellValue;
227.
case
CellType.FORMULA:
//FORMULA:
228.
default
:
229.
return
"="
+ cell.CellFormula;
230.
}
231.
}
232.
#endregion
233.
234.
#region Excel2007和简单的Excel2010
235.
/// <summary>
236.
/// 将Excel文件中的数据读出到DataTable中(xlsx)
237.
/// </summary>
238.
/// <param name="file">文件路径</param>
239.
/// <returns>DataTable</returns>
240.
public
static
DataTable ExcelToTableForXLSX(
string
file)
241.
{
242.
DataTable dt =
new
DataTable();
243.
using
(FileStream fs =
new
FileStream(file, FileMode.Open, FileAccess.Read))
244.
{
245.
XSSFWorkbook xssfworkbook =
new
XSSFWorkbook(fs);
246.
ISheet sheet = xssfworkbook.GetSheetAt(0);
247.
248.
// 表头
249.
IRow header = sheet.GetRow(sheet.FirstRowNum);
250.
List<
int
> columns =
new
List<
int
>();
251.
for
(
int
i = 0; i < header.LastCellNum; i++)
252.
{
253.
object
obj = GetValueTypeForXLSX(header.GetCell(i)
as
XSSFCell);
254.
if
(obj ==
null
|| obj.ToString() ==
string
.Empty)
255.
{
256.
dt.Columns.Add(
new
DataColumn(
"Columns"
+ i.ToString()));
257.
// continue;
258.
}
259.
else
260.
dt.Columns.Add(
new
DataColumn(obj.ToString()));
261.
columns.Add(i);
262.
}
263.
264.
// 数据
265.
for
(
int
i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
266.
{
267.
DataRow dr = dt.NewRow();
268.
bool
hasValue =
false
;
269.
foreach
(
int
j
in
columns)
270.
{
271.
dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j)
as
XSSFCell);
272.
if
(dr[j] !=
null
&& dr[j].ToString() !=
string
.Empty)
273.
{
274.
hasValue =
true
;
275.
}
276.
}
277.
if
(hasValue)
278.
{
279.
dt.Rows.Add(dr);
280.
}
281.
}
282.
}
283.
284.
return
dt;
285.
}
286.
287.
/// <summary>
288.
/// 将DataTable数据导出到Excel文件中(xlsx)
289.
/// </summary>
290.
/// <param name="dt">数据源</param>
291.
/// <param name="excelName">文件名称</param>
292.
public
static
void
TableToExcelForXLSX(DataTable dt,
string
excelName)
293.
{
294.
XSSFWorkbook xssfworkbook =
new
XSSFWorkbook();
295.
ISheet sheet = xssfworkbook.CreateSheet(
"Test"
);
296.
297.
//表头
298.
IRow row = sheet.CreateRow(0);
299.
for
(
int
i = 0; i < dt.Columns.Count; i++)
300.
{
301.
ICell cell = row.CreateCell(i);
302.
cell.SetCellValue(dt.Columns[i].ColumnName);
303.
}
304.
305.
//数据
306.
for
(
int
i = 0; i < dt.Rows.Count; i++)
307.
{
308.
IRow row1 = sheet.CreateRow(i + 1);
309.
for
(
int
j = 0; j < dt.Columns.Count; j++)
310.
{
311.
ICell cell = row1.CreateCell(j);
312.
cell.SetCellValue(dt.Rows[i][j].ToString());
313.
}
314.
}
315.
316.
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
317.
curContext.Response.Clear();
318.
curContext.Response.ContentType =
"application/x-excel"
;
319.
string
filename = HttpUtility.UrlEncode(excelName + DateTime.Now.ToString(
"yyyyMMddHHmm"
) +
".xlsx"
);
320.
curContext.Response.AddHeader(
"Content-Disposition"
,
"attachment;filename="
+ filename);
321.
xssfworkbook.Write(curContext.Response.OutputStream);
322.
curContext.Response.End();
323.
}
324.
325.
/// <summary>
326.
/// 获取单元格类型(xlsx)
327.
/// </summary>
328.
/// <param name="cell">单元格</param>
329.
/// <returns>单元格类型</returns>
330.
private
static
object
GetValueTypeForXLSX(XSSFCell cell)
331.
{
332.
if
(cell ==
null
)
333.
return
null
;
334.
switch
(cell.CellType)
335.
{
336.
case
CellType.BLANK:
//BLANK:
337.
return
null
;
338.
case
CellType.BOOLEAN:
//BOOLEAN:
339.
return
cell.BooleanCellValue;
340.
case
CellType.NUMERIC:
//NUMERIC:
341.
return
cell.NumericCellValue;
342.
case
CellType.STRING:
//STRING:
343.
return
cell.StringCellValue;
344.
case
CellType.ERROR:
//ERROR:
345.
return
cell.ErrorCellValue;
346.
case
CellType.FORMULA:
//FORMULA:
347.
default
:
348.
return
"="
+ cell.CellFormula;
349.
}
350.
}
351.
#endregion
352.
}
TableToExcelForXLSAny方法中第一个参数为DataTable,第二个参数为报表名称 ,调用此方法时,因为excel2003每一个sheet最多支持65535行数据,若是导出的数据量大于65535行时,会分为多个sheet。
4、导出excel2007格式
NPOIHelper.TableToExcelForXLSX(this.GetDataTable(), "excel2007或者excel2010导出");
TableToExcelForXLSX方法中第一个参数为DataTable,第二个参数为报表名称
5、将excel2003导入到DataTable中
DataTable dt = NPOIHelper.ExcelToTableForXLS(Server.MapPath("/TestFile/excel2003导入.xls"));
ExcelToTableForXLS中的参数为导入文件的物理路径
6、将excel2007导入到DataTable中
DataTable dt = NPOIHelper.ExcelToTableForXLSX(Server.MapPath("/TestFile/excel2007或者excel2010导入.xlsx"));
ExcelToTableForXLSX中的参数为导入文件的物理路径
CSV导出帮助类代码
01.
1
/// <summary>
02.
2
/// CSVHelper类
03.
3
/// </summary>
04.
4
public
class
CSVHelper
05.
5
{
06.
6
/// <summary>
07.
7
/// 导出CSV格式
08.
8
/// </summary>
09.
9
/// <param name="dt">数据源</param>
10.
10
/// <param name="FileName">保存的文件名称</param>
11.
11
public
static
void
DataTableToCSV(DataTable dt, string FileName)
12.
12
{
13.
13
Stopwatch stopWacth =
new
Stopwatch();
14.
14
stopWacth.Start();
// 开始计时器
15.
15
StringWriter sw =
new
StringWriter();
16.
16
StringBuilder sb =
new
StringBuilder();
17.
17
18.
18
//获得列名
19.
19
for
(
int
i =
0
; i < dt.Columns.Count; i++)
20.
20
{
21.
21
sb.Append(dt.Columns[i].ColumnName);
22.
22
if
(i != dt.Columns.Count -
1
)
23.
23
{
24.
24
sb.Append(
","
);
25.
25
}
26.
26
}
27.
27
sw.WriteLine(sb.ToString());
28.
28
29.
29
//获得每列的数据
30.
30
foreach (DataRow dr in dt.Rows)
31.
31
{
32.
32
for
(
int
i =
0
; i < dt.Columns.Count; i++)
33.
33
{
34.
34
sw.Write(dr[i]);
35.
35
if
(i != dt.Columns.Count -
1
)
36.
36
{
37.
37
sw.Write(
","
);
38.
38
}
39.
39
}
40.
40
41.
41
sw.WriteLine(
""
);
42.
42
}
43.
43
44.
44
sw.Close();
45.
45
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
46.
46
curContext.Response.Clear();
47.
47
curContext.Response.AddHeader(
"Content-Disposition"
,
"attachment; filename="
+ curContext.Server.UrlEncode(FileName) +
".csv"
);
48.
48
curContext.Response.ContentType =
"application/ms-excel"
;
49.
49
curContext.Response.ContentEncoding = System.Text.Encoding.Default;
// 采用默认编码输出
50.
50
curContext.Response.Write(sw);
51.
51
File.AppendAllText(curContext.Server.MapPath(
"/TestMinutes/TestResult.txt"
),
"\nCSV获得dataTable后导出数据速度:"
+stopWacth.ElapsedMilliseconds.ToString()+
"毫秒"
, System.Text.Encoding.UTF8);
52.
52
stopWacth.Stop();
53.
53
curContext.Response.End();
54.
54
}
55.
55
}
CSV和NPOI的比较
CSV文件简单说明:
每条记录占一行
以逗号为分隔符
逗号先后的空格会被忽略
字段中包含有逗号,该字段必须用双引号括起来
字段中包含有换行符,该字段必须用双引号括起来
字段先后包含有空格,该字段必须用双引号括起来
字段中的双引号用两个双引号表示
字段中若是有双引号,该字段必须用双引号括起来
字段中若是有太长的数字,该字段必须单引号括起来
日期格式不用作特殊处理
第一条记录,能够是字段名
CSV优势:
CSV格式的文件其实导出的是文本格式的文件,此种格式的文件优势导出方便并且比NPOI速度快。
CSV缺点:
使用者用excel对数据进行分析后须要对数据进行从新存一份。