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 ...
随机推荐
- hexo的jacman主题设置语言为英文后偶尔出现中文
发现这个问题也好久了.问题的具体表现是在根目录下的_config.yml设置了语言为英文,但是每次发布后都会更换一次语言.今天看了文件结构,知道了,每换一次语言“英文.简体中文.繁体中文”,就是这三种 ...
- Gym - 101848D:XOR(线性基 欧拉降幂)
题意:给定N,K,P,表示现在有一个集合{0, 1, ..., 2n - 1},问有多少个非空子集的异或和为K: 答案%P.(1 ≤ n ≤ 1018, 0 ≤ k ≤ min(2n - 1, 101 ...
- spark-shell操作hive
本文是在集群已经搭建好的基础上来说的,还没有搭建好集群的小伙伴还请自行百度! 启动spark-shell之前要先启动hive metastore 和 hiveservice2 hive --servi ...
- 解决ie6下png背景不能透明bug
/*第一种方法:通过滤镜 使用css解决的办法. 注意滤镜下的1像素透明gif的覆盖图片的路径是相对页面写的*/ /*注意:这个方法不适合处理img标签引入的png图片,代码太冗余了*/ .banne ...
- Js 日期字符串分别截取 年 月 日 时 分 秒
function shijiantime(times){ var timearr = times.replace(" ", ":").replace(/\:/g ...
- 大文件断点续传插件webupload插件
java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接 ...
- 验证码破解 | Selenium模拟登陆微博
模拟登陆微博相对来说,并不难.验证码是常规的5个随机数字字母的组合,识别起来也比较容易.主要是用到许多Selenium中的知识,如定位标签.输入信息.点击等.如对Selenium的使用并不熟悉,请先移 ...
- 4.学习springmvc的响应数据和结果视图
一.返回值分类: 字符串:返回值为需要展示的视图 void:返回为默认的页面(方法名.jsp) ModleAndView:存储对象并返回设置的页面 1.字符串: jsp: <a href=&qu ...
- Vuejs简介
一.网站交互方式 ①传统的开发方式:PHP 中,页面和服务端糅合在一起,在这种项目中服务端占比更重,因为绝大多数都服务端技术,绝大多数网站都是这样的方式 ②前后端分离方式:服务端只处理数据(不关心页面 ...
- vuex传递数据的流程
当组件修改数据的时候必须通过store.dispatch来调用actions中的方法,当actions中的方法被触发的时候通过调用commit的方法来触发mutations里面的方法,mutation ...