数据原共400条数据,21列,我是双核cpu,4G内存
1. Excel com组件
要3秒左右,上千条30秒+这种方法比较慢,要引用Microsoft.Office.Interop.Excel

#region DataSet导入到Excel里(最原始样式)
/// <summary>
/// DataSet导入到Excel里,多个DataTable分成多个Sheet,Sheet名以TableName命名
/// </summary>
/// <param name="DS">要导入的Excel</param>
/// <param name="FilePathAndName">要保存的路径和文件名(绝对路径)</param>
public static void DataSetToExcel(DataSet DS, string FilePathAndName)
{
string strName = FilePathAndName.Replace(@"\\", @"\").Replace(@"\\", @"\").Replace(@"\\", @"\");
strName = FilePathAndName;
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
try
{
excel.Visible = false;
//设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = false;
excel.AlertBeforeOverwriting = false;
//增加一个工作簿
Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Add(true);
System.Reflection.Missing miss = System.Reflection.Missing.Value;
//添加工作表
Microsoft.Office.Interop.Excel.Worksheet sheets = (Microsoft.Office.Interop.Excel.Worksheet)
book.Worksheets.Add(miss, miss, , Microsoft.Office.Interop.Excel.XlSheetType.xlWorksheet);
for (int i = ; i < DS.Tables.Count; i++)
{
System.Data.DataTable table = DS.Tables[i];
//获取一个工作表
//Microsoft.Office.Interop.Excel.Worksheet sheet = book.Worksheets[i + 1] as Microsoft.Office.Interop.Excel.Worksheet; Microsoft.Office.Interop.Excel.Worksheet sheet = book.Worksheets.Add(book.Worksheets[i + ], Type.Missing, Type.Missing, Type.Missing) as Microsoft.Office.Interop.Excel.Worksheet;
int rowIndex = ;
int colIndex = ;
foreach (DataColumn col in table.Columns)
{
colIndex++;
sheet.Cells[, colIndex] = col.ColumnName;
Microsoft.Office.Interop.Excel.Range Range1 = (Microsoft.Office.Interop.Excel.Range)sheet.Cells[, colIndex];
Range1.Font.Bold = true;//表头字体加粗
Range1.Borders.Value = ;
}
foreach (DataRow row in table.Rows)
{
rowIndex++;
colIndex = ;
foreach (DataColumn col in table.Columns)
{
colIndex++;
sheet.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
}
}
//sheet.Name = tableNames[i];
sheet.Name = GetLegalFileName(DS.Tables[i].TableName.ToString());
}
//删除多余Sheet
for (int g = ; g <= book.Worksheets.Count; g++)
{
Microsoft.Office.Interop.Excel.Worksheet sheet = book.Worksheets[g] as Microsoft.Office.Interop.Excel.Worksheet; if (sheet.Name.Length > && sheet.Name.Substring(, ) == "Sheet")
{
sheet.Delete();
g--;
}
}
//book.Save();
book.SaveAs(strName, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
book.Close(false, miss, miss);
book = null;
}
catch (Exception)
{
throw;
}
finally
{
KillExcelProcess(excel);//结束Excel进程
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
#endregion

2. OLEDB

这个需要3秒左右,要using System.Data.OleDb;

#region oledb方式
public static void ExcelExport(DataTable dt, string filepath, string tablename)
{
//excel 2003格式
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;";
//Excel 2007格式
//string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=Excel 12.0 Xml;";
try
{
using (OleDbConnection con = new OleDbConnection(connString))
{
con.Open();
StringBuilder strSQL = new StringBuilder();
strSQL.Append("CREATE TABLE ").Append("[" + tablename + "]");
strSQL.Append("(");
for (int i = ; i < dt.Columns.Count; i++)
{
strSQL.Append("[" + dt.Columns[i].ColumnName + "] text,");
}
strSQL = strSQL.Remove(strSQL.Length - , );
strSQL.Append(")"); OleDbCommand cmd = new OleDbCommand(strSQL.ToString(), con);
cmd.ExecuteNonQuery(); for (int i = ; i < dt.Rows.Count; i++)
{
strSQL.Clear();
StringBuilder strfield = new StringBuilder();
StringBuilder strvalue = new StringBuilder();
for (int j = ; j < dt.Columns.Count; j++)
{
strfield.Append("[" + dt.Columns[j].ColumnName + "]");
strvalue.Append("'" + dt.Rows[i][j].ToString() + "'");
if (j != dt.Columns.Count - )
{
strfield.Append(",");
strvalue.Append(",");
}
else
{
}
}
cmd.CommandText = strSQL.Append(" insert into [" + tablename + "]( ")
.Append(strfield.ToString())
.Append(") values (").Append(strvalue).Append(")").ToString();
cmd.ExecuteNonQuery();
}
con.Close();
}
Console.WriteLine("OK");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

3.NPOI
 这个在有二种方式,第一种在web页面下,很快,秒的速度,但是下下来的方式没有保存在某一目录下

aspx页只有一个按钮就可以了,.cs文件代码如下

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.SS.UserModel; namespace ExportXlsToDownload
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } protected void Button1_Click(object sender, EventArgs e)
{
string filename="test.xls";
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}",filename));
Response.Clear(); InitializeWorkbook();
GenerateData();
GetExcelStream().WriteTo(Response.OutputStream);
Response.End();
} HSSFWorkbook hssfworkbook; MemoryStream GetExcelStream()
{
//Write the stream data of workbook to the root directory
MemoryStream file = new MemoryStream();
hssfworkbook.Write(file);
return file;
} void GenerateData()
{
ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1"); sheet1.CreateRow().CreateCell().SetCellValue("This is a Sample");
int x = ;
for (int i = ; i <= ; i++)
{
IRow row = sheet1.CreateRow(i);
for (int j = ; j < ; j++)
{
row.CreateCell(j).SetCellValue(x++);
}
}
} void InitializeWorkbook()
{
hssfworkbook = new HSSFWorkbook(); ////create a entry of DocumentSummaryInformation
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "NPOI Team";
hssfworkbook.DocumentSummaryInformation = dsi; ////create a entry of SummaryInformation
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "NPOI SDK Example";
hssfworkbook.SummaryInformation = si;
}
}
}

第二种方式,可以保存在目录下,也是秒存,代码如下

    public class NPOIExcel
{
//最大数据条数
readonly int EXCEL03_MaxRow = ; /// <summary>
/// 将DataTable转换为excel2003格式。
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public byte[] DataTable2Excel(DataTable dt, string sheetName)
{ IWorkbook book = new HSSFWorkbook();
if (dt.Rows.Count < EXCEL03_MaxRow)
DataWrite2Sheet(dt, , dt.Rows.Count - , book, sheetName);
else
{
int page = dt.Rows.Count / EXCEL03_MaxRow;
for (int i = ; i < page; i++)
{
int start = i * EXCEL03_MaxRow;
int end = (i * EXCEL03_MaxRow) + EXCEL03_MaxRow - ;
DataWrite2Sheet(dt, start, end, book, sheetName + i.ToString());
}
int lastPageItemCount = dt.Rows.Count % EXCEL03_MaxRow;
DataWrite2Sheet(dt, dt.Rows.Count - lastPageItemCount, lastPageItemCount, book, sheetName + page.ToString());
}
MemoryStream ms = new MemoryStream();
book.Write(ms);
return ms.ToArray();
}
private void DataWrite2Sheet(DataTable dt, int startRow, int endRow, IWorkbook book, string sheetName)
{
ISheet sheet = book.CreateSheet(sheetName);
IRow header = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
ICell cell = header.CreateCell(i);
string val = dt.Columns[i].Caption ?? dt.Columns[i].ColumnName;
cell.SetCellValue(val);
}
int rowIndex = ;
for (int i = startRow; i <= endRow; i++)
{
DataRow dtRow = dt.Rows[i];
IRow excelRow = sheet.CreateRow(rowIndex++);
for (int j = ; j < dtRow.ItemArray.Length; j++)
{
excelRow.CreateCell(j).SetCellValue(dtRow[j].ToString());
}
} }
}

第二种方式调用如下:

DataTable dt=GetData();
NPOIExcel myhelper = new NPOIExcel();
byte[] data = myhelper.DataTable2Excel(dt,"sheet");
string path = "d:\\temp" + DateTime.Now.Ticks.ToString() + ".xls";
if (!File.Exists(path))
{
FileStream fs = new FileStream(path, FileMode.CreateNew);
fs.Write(data, , data.Length);
fs.Close(); }

.net导出Excel几种方式比较的更多相关文章

  1. 关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结

    poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产生内存溢出问题,SXSSFWorkbook是一种大数据量导出格式,csv是另一种excel导出的一种轻快的 ...

  2. js 实现纯前端将数据导出excel两种方式,亲测有效

    由于项目需要,需要在不调用后台接口的情况下,将json数据导出到excel表格,兼容chrome没问题,其他还没有测试过 通过将json遍历进行字符串拼接,将字符串输出到csv文件,输出的文件不会再是 ...

  3. Hive数据导入导出的几种方式

    一,Hive数据导入的几种方式 首先列出讲述下面几种导入方式的数据和hive表. 导入: 本地文件导入到Hive表: Hive表导入到Hive表; HDFS文件导入到Hive表; 创建表的过程中从其他 ...

  4. Hive创建表|数据的导入|数据导出的几种方式

    * Hive创建表的三种方式 1.使用create命令创建一个新表 例如:create table if not exists db_web_data.track_log(字段) partitione ...

  5. Excel导出的几种方式

    1.html 前台html与js代码(文件:ExportExcelByHtml.aspx): <html xmlns="http://www.w3.org/1999/xhtml&quo ...

  6. Hive数据导入导出的n种方式

    Tutorial-LoadingData Hive加载数据的6种方式 #格式 load data [local] inpath '/op/datas/xxx.txt' [overwrite] into ...

  7. excel导入导出的两种方式:csv和XLS

    依赖 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl ...

  8. C++ DLL导出的两种方式和链接的两种方式

    第一种 导出方式 extern "C" _declspec(dllexport) int Plus(int x, int y); extern "C" _dec ...

  9. Hive数据导出的几种方式

    在hive的日常使用中,经常需要将hive表中的数据导出来,虽然hive提供了多种导出方式,但是面对不同的数据量.不同的需求,如果随意就使用某种导出方式,可能会导致导出时间过长,导出的结果不满足需求, ...

随机推荐

  1. Cash Machine POJ - 1276 多重背包二进制优化

    题意:多重背包模型  n种物品 每个m个  问背包容量下最多拿多少 这里要用二进制优化不然会超时 #include<iostream> #include<cstdio> #in ...

  2. Repository HDU - 2846 字典树

    题意:给出很多很多很多很多个 单词 类似搜索引擎一下 输入一个单词 判断有一个字符串包含这个单词 思路:字典树变体,把每个单词的后缀都扔字典树里面,这里要注意dd是一个单词 但是把d 和dd都放字典树 ...

  3. 洛谷P1434滑雪题解及记忆化搜索的基本步骤

    题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...

  4. android最最基础简单的保存xml代码

    y偶遇非常基础,我想直接上代码: MainActivity.java: package com.lgqchinese.xmlcreate; import android.support.v7.app. ...

  5. Google Apps的单点登录-谷歌使用的单点登录

    简述: Customer :客户 Google:谷歌 Identity Provider:身份提供者安全断言标记语言(英语:Security Assertion Markup Language,简称S ...

  6. 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)

    题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...

  7. jsp (2)

    一.内置对象: 二.如何在代码中使用js代码: <script type="text/javascript" src="js的路径名"></s ...

  8. nuxt.js实战之用vue-i18n实现多语言

    一.实现步骤 1.安装vue-i18n并且创建store.js(vuex状态管理)文件 2.创建一个(middleware)中间件,用来管理不同的语言 3.创建不同语言的json文件作为语言包(例如: ...

  9. 洛谷P4362 贪吃的九头龙

    大意就是把一棵树的点染成m种颜色,其中1号点的颜色必须染恰好k个节点. 总代价是所有两端点颜色相同的边的边权. 求最小代价. 解:可以分为m == 2和m > 2两个题. m > 2时有代 ...

  10. 洛谷P4774 屠龙勇士

    啊我死了. 肝了三天的毒瘤题......他们考场怎么A的啊. 大意: 给你若干个形如 的方程组,求最小整数解. 嗯......exCRT的变式. 考虑把前面的系数化掉: 然后就是exCRT板子了. 我 ...