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 ...
随机推荐
- 遗传算法介绍并附上Python代码
之前介绍过遗传算法,参见:https://www.cnblogs.com/LoganChen/p/7509702.html 我们用Python实现同样的问题解答. y=10*sin(5*x)+7*ab ...
- 服务器端渲染 VS 浏览器端渲染
这里的渲染,就是指生成html文档的过程,和浏览器渲染html没有关系. 浏览器端渲染,指的是用js去生成html,前端做路由.举例:React, Vue等等前端框架.适合单页面应用程序. 服务器端渲 ...
- Java中的Import语句如何理解?
作用: 编译时:它只是进行语法检查和格式转换:与头文件作用相同. 运行时:依赖类加载. http://bbs.csdn.net/topics/390397328 前面说的java的编译,这里纠正一下, ...
- NYOJ104-最大和-(前缀和)
题意:给一个矩阵,每个元素有正有负,求最大矩阵和. 解题: (1)对原矩阵a用前缀和处理,处理变成矩阵sum,sum[i][j]表示从左上角为a[1][1]到右下角a[i][j]的全部元素和. 矩阵必 ...
- org.springframework.security.access.AccessDeniedException: Access is denied
org.springframework.security.access.AccessDeniedException: Access is denied at org.springframework.s ...
- Passwords Gym - 101174E (AC自动机上DP)
Problem E: Passwords \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出两个正整数\(A,B\),再给出\(n\)个字符 ...
- LeetCode 1100. Find K-Length Substrings With No Repeated Characters
原题链接在这里:https://leetcode.com/problems/find-k-length-substrings-with-no-repeated-characters/ 题目: Give ...
- xsxsxs
def getdecrype(l): a= length="" ): if(l[a]=="x"): break else: length+=l[a] a+= h ...
- Django实现自动发布(3发布-安装)
相对于服务的升级.回退,新部署一个服务要复杂一些,要满足以下要求: 已经运行了服务实例的主机不能重复部署 进程启动需要的配置文件要先同步到主机上 之前的升级.回退都是指进程的操作,不涉及配置文件的变更 ...
- Salt Highstate数据结构定义
作者言 这篇文档详细解释了SLS文件中,每个部分的名称与含义,以及SLS中的数据处理后的数据结构. 我只是SaltStack的初学者,如果文中有错误的地方,请不吝赐教.在学习的过程,我做了一些实验,犯 ...