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 ...
随机推荐
- django云端留言板
1.创建应用 django-admin startproject cloudms cd cloudms python manage.py startapp msgapp 2.创建模板文件 在cloud ...
- Centos7-bond模式介绍
bond模式: Mode=0(balance-rr)表示负载分担round-robin Mode=1(active-backup)表示主备模式,只有一块网卡是active,另外一块是备的standby ...
- 20180527模拟赛T1——新田忌赛马
[问题描述] (注:此题为d2t2-难度) 田忌又在跟大王van赛马的游戏 田忌与大王一共有2n匹马,每个马都有一个能力值x,1<=x<=2n且每匹马的x互不相同.每次田忌与大王放出一匹马 ...
- Ping任务管理模块-JavaWeb
总体框架: 1.创建任务 2.修改任务 3.删除任务 4.环境配置 5.全量PING 6.抽样PING 7.停止 8.查看历史 9.查看执行详情 主要从项目总结和经验角度讲述: 一.项目运行环境 1. ...
- 重构之字段改名 UML行为图 用例图 时序图&协作图 状态图&活动图 依恋情结
简单的使用一下字段改名 为什么使用字段改名: 你在一个软件上做的工作越多,对这个软件的数据的理解就越深刻,你需要把这些理解融入到代码中.利用名字的解释作用,让代码更容易被理解. 如何找到该变量的所 ...
- SpringBoot中实现Spring容器中注入类型相同但名不同Bean
@Bean(autowire = Autowire.BY_NAME,value = "kaptchaProducer") public Producer kaptchaProduc ...
- Nuxt项目中通过ESlint命令行修复格式问题
在package.json文件中, 往往会有个类似于 "lint": "eslint --ext .js,.vue --ignore-path .gitignore .& ...
- 【每天学一点linux】后台进程不打印日志
command > out.file 2>&1 & 将文件输出到指定的文件中
- Pandas模块 --- 字符与日期型数据的处理
1,pd.to_datetime( 要转换的日期, format= ), 2,pd.to_datetime.today( ).year ,pd.to_datetime.now( ).year 3,字 ...
- Nginx+Php-fpm运行原理 代理与反向代理
一.代理与反向代理 现实生活中的例子 1.正向代理:访问google.com 如上图,因为google被墙,我们需要vpnFQ才能访问google.com.Virtual Private Networ ...