c# 导出excel的三种方式
第一种:流导出
SaveFileDialog exe = new SaveFileDialog();
exe.Filter = "Execl files (*.xls)|*.xls";
exe.FilterIndex = ;
exe.RestoreDirectory = true;
//exe.CreatePrompt = true;
exe.Title = "Export Excel File";
exe.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
exe.FileName = string.Format("{0}_{1}", DateTime.Now.ToString("yyyy-MM-dd HH时mm分ss秒"), "导出");
DialogResult dr = exe.ShowDialog();
if (dr != DialogResult.OK)
{
return;
} Stream ms;
ms = exe.OpenFile();
StreamWriter sw = new StreamWriter(ms, System.Text.Encoding.GetEncoding(-));
string str = "";
try
{
for (int i = ; i < dtb.Columns.Count; i++)
{
if (i > )
{
str += "\t";
}
str += dtb.Columns[i].HeaderText;
}
sw.WriteLine(str);
for (int j = ; j < dtb.Rows.Count; j++)
{
string temp = "";
for (int k = ; k < dtb.Columns.Count; k++)
{
if (k > )
{
temp += "\t";
}
string cell = dtb.Rows[j].Cells[k].Value.ToString();
cell = cell.Replace(" ", "").Replace("\r", "").Replace("\n", "").Replace("\r\n", "");
temp += cell;
}
sw.WriteLine(temp);
}
sw.Close();
ms.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
finally
{
sw.Close();
ms.Close();
}
第二种:使用 Microsoft.Office.Interop.Excel.dll
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
return;
}
try
{ Workbooks wbs = xlApp.Workbooks;
Workbook wb = wbs.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[];
Range range = xlApp.Range[ws.Cells[, ], ws.Cells[, colcount]];
range.Font.Size = ;
range.Font.Bold = true;
range.Interior.ColorIndex = ;
range.HorizontalAlignment = Constants.xlCenter; object[,] obj = new object[rowcount + , colcount];
foreach (DataGridViewColumn col in dtb.Columns)
{
obj[rowindex, colindex++] = col.HeaderText;
}
for (rowindex = ; rowindex < rowcount + ; rowindex++)
{
for (colindex = ; colindex < colcount; colindex++)
{
obj[rowindex, colindex] = "'" + dtb[colindex, rowindex - ].Value;
}
System.Windows.Forms.Application.DoEvents();
}
range = ws.Range[xlApp.Cells[, ], xlApp.Cells[rowcount + , colcount]];
range.Value2 = obj;
wb.Saved = true;
wb.SaveCopyAs(exe.FileName); //for (int i = 0; i < dtb.ColumnCount; i++)
//{
// if (dtb.Columns[i].Visible)
// {
// colindex++;
// ws.Cells[1, colindex] = dtb.Columns[i].HeaderText;
// }
//}
//for (int r = 0; r < dtb.Rows.Count; r++)
//{
// colindex = 0;
// for (int i = 0; i < dtb.ColumnCount; i++)
// {
// if (dtb.Columns[i].Visible)
// {
// colindex++;
// ws.Cells[r + 2, colindex] = "'" + dtb.Rows[r].Cells[i].Value;
// }
// }
//}
//System.Windows.Forms.Application.DoEvents();
//wb.SaveAs(exe.FileName);
}
catch (Exception ex)
{
MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
}
finally
{
xlApp.Quit();
GC.Collect();
}
这两种方法导出 .xlsx 格式的 Excel 文件时,没办法打开。导出 .xls 格式的,会提示文件格式和扩展名不匹配(没找到办法解决,找到的园友留下言),但是可以打开的。
第二种电脑必须要安装 office,而且导出速度慢,导出大数据时性能很差。
第三种:Microsoft.Jet.OLEDB
// Excel 2003 版本连接字符串
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/xxx.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=2;'"; // Excel 2007 以上版本连接字符串
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/xxx.xlsx;Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;'";
Provider:驱动程序名称
Data Source:指定 Excel 文件的路径
Extended Properties:Excel 8.0 针对 Excel 2000 及以上版本;Excel 12.0 针对 Excel 2007 及以上版本。
HDR:Yes 表示第一行包含列名,在计算行数时就不包含第一行。NO 则完全相反。
IMEX:0 写入模式;1 读取模式;2 读写模式。如果报错为“不能修改表 sheet1 的设计。它在只读数据库中”,那就去掉这个,问题解决。
private string ToExcel(DataGridView dtb,string filename)
{
try
{
int colcount = dtb.ColumnCount;
int rowcount = dtb.RowCount;
if (rowcount > )
{
string path = @"export\";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string pfilename = path + filename + ".xls";
File.Copy(path + "model.xls", pfilename);
//string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pfilename + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2;\"";
using (OleDbConnection ole =new OleDbConnection())
{
//ole.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pfilename + ";Extended Properties=\"Excel 12.0 Xml;HDR=Yes\"";
ole.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pfilename + ";Extended Properties=\"Excel 8.0;HDR=Yes;\"";
ole.Open();
using(OleDbCommand oleCmd=new OleDbCommand())
{
oleCmd.Connection = ole; //System.Data.DataTable dtsheet = ole.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
//foreach(DataRow dr in dtsheet.Rows)
//{
// oleCmd.CommandText = "drop table [" + dr["TABLE_NAME"].ToString() + "]";
// oleCmd.ExecuteNonQuery();
//}
//oleCmd.CommandText = "drop table [Sheet1$]";
//oleCmd.ExecuteNonQuery(); ArrayList alCol = new ArrayList();
OleDbParameter[] para = new OleDbParameter[colcount];
ArrayList aric = new ArrayList();
ArrayList ariv = new ArrayList();
for(int i = ; i < colcount; i++)
{
para[i] = new OleDbParameter("@" + dtb.Columns[i].HeaderText, OleDbType.VarChar);
alCol.Add("[" + dtb.Columns[i].HeaderText + "] VarChar");
aric.Add("[" + dtb.Columns[i].HeaderText + "]");
ariv.Add("@" + dtb.Columns[i].HeaderText);
}
string strIs = "insert into [Sheet1$] (" + string.Join(",", aric.ToArray()) + ") values (" + string.Join(",", ariv.ToArray()) + ")";
string strCs = "create table [Sheet1$] (" + string.Join(",", alCol.ToArray()) + ")"; oleCmd.CommandText = strCs;
int en = oleCmd.ExecuteNonQuery(); List<OleDbParameter> lop = new List<OleDbParameter>();
ArrayList arrow = new ArrayList();
for(int j = ; j < rowcount; j++)
{
arrow.Clear();
lop.Clear();
oleCmd.Parameters.Clear();
for(int k = ; k < colcount; k++)
{
para[k].Value = dtb[k, j].Value.ToString();
oleCmd.Parameters.Add(para[k]);
}
//oleCmd.Connection = ole;
oleCmd.CommandText = strIs;
oleCmd.ExecuteNonQuery();
}
}
}
return "success";
}else
{
return "null";
}
}catch(Exception ex)
{
return ex.Message;
}
}
这种方法需要指定一个已经存在的 Excel 文件作为写入数据的模板,不然的话就得使用流创建一个新的 Excel 文件,但是这样是没法识别的,那就需要用到 Microsoft.Office.Interop.Excel.dll 里面的 Microsoft.Office.Interop.Excel.Workbook.SaveCopyAs() 方法另存为一下,这样性能也就更差了。
使用操作命令创建的表都是在最后面的,前面的也没法删除(我是没有找到方法),当然也可以不再创建,直接写入数据也可以。但是很奇怪,直接写入时列头下的第一行会空白着,数据从第三行开始写入。如果是新建表写入数据就不会出现这种情况。
c# 导出excel的三种方式的更多相关文章
- POI导出excel的三种方式
原文链接:https://www.cnblogs.com/zhaoblog/p/7661245.html poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产 ...
- 导出excel的三种方式
第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的时候会有提示,而且不好控制内容.第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的 ...
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- 将datatable导出为excel的三种方式(转)
一.使用Microsoft.Office.Interop.Excel.DLL 需要安装Office 代码如下: 2 public static bool ExportExcel(Sy ...
- C#读取Excel的三种方式以及比较
(1)OleDB方式 优点:将Excel直接当做数据源处理,通过SQL直接读取内容,读取速度较快. 缺点:读取数据方式不够灵活,无法直接读取某一个单元格,只有将整个Sheet页读取出来后(结果为Dat ...
- ASP.net导出Excel的几种方式
2.导出多个sheet页的Excel 在Office Excel 中设计好 导出的格式,然后另存为xml电子表格,然后用记事本打开保存的xml文件,复制内容放入程序Response.Write() 输 ...
- oracle 导入导出 dmp 的三种方式
1.命令行参数 比如:exp scott/tiger@orcl tables=emp file=D:\test.dmp 2.交互提示符 比如:C:\Users\Administrator>exp ...
- oracle数据的导入导出(两种方法三种方式)
大概了解数据库中数据的导入导出.在oracle中,导入导出数据的方法有两种,一种是使用cmd命令行的形式导入导出数据,另一种是使用PL/SQL工具导入导出数据. 1,使用cmd命令行导入导出数据 1. ...
- Python|读、写Excel文件(三种模块三种方式)
python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pandas进行excel读写: imp ...
随机推荐
- php单例型(singleton pattern)
搞定,吃饭 <?php /* The purpose of singleton pattern is to restrict instantiation of class to a single ...
- 彻底理解 Cookie、Session、Token
发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记 ...
- iwlist/iwconfig/iw命令
1.iwlist 命令:用于对/proc/net/wireless文件进行分析,得出无线网卡相关信息 # iwlist wlan0 scanning 搜索当前无线网络 # iwlist wlan0 f ...
- Beta产品测试报告:那周余嘉熊掌将得队、为了交项目干杯队
测试对象: 那周余嘉熊掌将得队 一.截图 安装截图 运行截图 二.测试情况 1.第一次上手体验感觉如何?能否正常运行? 界面UI设计令人眼前一亮,客户端和管理员端皆可正常运行.组件动画流畅,响应流畅, ...
- Spring Cloud 之 Hystrix 知识点:隔离、熔断、降级
Hystrix 是隔离.熔断以及降级的一个框架. Hystrix 的隔离: Hystrix 会搞很多个小小的线程池,比如订单服务请求库存服务是一个线程池,请求仓储服务是一个线程池,请求积分服务是一个线 ...
- presto-gateway nodejs client
目前已经有了好几个presto nodejs 的client,为了方便presto-gateway 的连接,修改了一个现有的nodejs client 可以方便的连接presto-gateway 原理 ...
- CSP-2019酱油记
炸了 Day0 上午机房弥漫着颓废的气息... nc哥在疯狂打板子,我疯狂找水题找信心(然而被历次联赛T1爆切 退役气息稍重,好多人刷屏cnblogs.. 然后年级扛把子们来做指♂导啦- 准备了火龙果 ...
- DT包 -- R语言中自定义表格数据
DT 包提供了 JavaScript 库 DataTables 的一个R接口,它使得R对象(矩阵或数据框)可以在HTML页面上显示为表格. 该包的DataTables函数生成的表格提供了数据的筛选.分 ...
- mybatis之批量查询
关于MyBatis批量更新和添加,参考我的如下文章即可:MyBatis的批量更新实例 MyBatis的批量添加实例 另外不管是批量的新增.删除.修改.查询也好,还是单个新增.删除.修改查询也罢.都会用 ...
- 服务器负载过高问题分析-不是cpu高负载也不是IO负载如何处理(阿里 几乎是必考题)
关于top命令 经常问load average 参考:load average 定义(网易面试) jvm dump的使用 参考:Jvm dump jstack jmap jstat 介绍与使用(内存与 ...