第一种:流导出

            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的三种方式的更多相关文章

  1. POI导出excel的三种方式

    原文链接:https://www.cnblogs.com/zhaoblog/p/7661245.html poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产 ...

  2. 导出excel的三种方式

    第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的时候会有提示,而且不好控制内容.第一种是Response输出,这种方式输出的文件不符合标准的excel格式,在打开的 ...

  3. .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)

    .Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构)   public cl ...

  4. 将datatable导出为excel的三种方式(转)

    一.使用Microsoft.Office.Interop.Excel.DLL 需要安装Office 代码如下:  2         public static bool ExportExcel(Sy ...

  5. C#读取Excel的三种方式以及比较

    (1)OleDB方式 优点:将Excel直接当做数据源处理,通过SQL直接读取内容,读取速度较快. 缺点:读取数据方式不够灵活,无法直接读取某一个单元格,只有将整个Sheet页读取出来后(结果为Dat ...

  6. ASP.net导出Excel的几种方式

    2.导出多个sheet页的Excel 在Office Excel 中设计好 导出的格式,然后另存为xml电子表格,然后用记事本打开保存的xml文件,复制内容放入程序Response.Write() 输 ...

  7. oracle 导入导出 dmp 的三种方式

    1.命令行参数 比如:exp scott/tiger@orcl tables=emp file=D:\test.dmp 2.交互提示符 比如:C:\Users\Administrator>exp ...

  8. oracle数据的导入导出(两种方法三种方式)

    大概了解数据库中数据的导入导出.在oracle中,导入导出数据的方法有两种,一种是使用cmd命令行的形式导入导出数据,另一种是使用PL/SQL工具导入导出数据. 1,使用cmd命令行导入导出数据 1. ...

  9. Python|读、写Excel文件(三种模块三种方式)

    python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pandas进行excel读写: imp ...

随机推荐

  1. reset.css文件下载及剖析

    @charset "utf-8"; /* http://meyerweb.com/eric/tools/css/reset/ v2.0-modified | 20110126 Li ...

  2. DRF序列化和反序列化(二:ModelSerializer)

    一: rest_framework 中 serializers.Serializer的不方便之处(以下简称Serializer) a:需要定义每一个字段,并且这个字段是和models字段及其类似. b ...

  3. alpha冲刺事后诸葛亮(团队)

    alpha冲刺事后诸葛亮(团队) 课程名称:软件工程1916|W(福州大学) 团队名称: 云打印 作业要求: 项目Alpha冲刺(团队) 作业目标:完成Alpha冲刺的事后诸葛亮 团队队员 队员学号 ...

  4. LoadRunner【第一篇】下载、安装、破解、修改端口号

    loadrunner11下载 loadrunner11大小有4g多,相对另外一款开源的性能测试工具jmeter来说,是非常笨重的了,可以关注公众号联系作则获取. loadrunner11安装(win7 ...

  5. 【转载】TCP协议

    首部格式 图释: 各个段位说明: 源端口和目的端口:各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现 序号:占 4 字节.TCP 连接中传送的数据流中的每一个 ...

  6. excel双击下拉制作(以及双击下拉字符超限处理)

    最近,在项目的开发过程中,遇到了一个问题,自己要修改代码中的excel模板,有些列要处理成双击下拉的形式. excel制作双击下拉: 当然,我想,这对于大家来说是不难的,好实现,但是,我在制作的过程中 ...

  7. windows jenkins dotnet core 自动化构建webapi

    jenkins环境搭建好 注意一下几点: - 需要安装git - 需要安装dotnet core sdk环境 - 遇到这里报错,提示 Repository URL 错误的话,如果确实没有配置错误,重启 ...

  8. python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作

    一.匿名函数 递归:就是调用自己 def func(): num = int(input('num:')) if num % 2 ==0: print('是偶数') return else: func ...

  9. gevent.queue

    目录 Gevent gevent基础之阻塞,非阻塞 同步,异步概念 同步异步与阻塞,非阻塞区别 Queue python内置Queue介绍 Gevent gevent基础之阻塞,非阻塞 1.geven ...

  10. MongonDB

    目录 1.下载MongoDB 2.启动MongoDB 3.添加环境变量,添加启动服务 1.下载MongoDB MongoDB的官网 简单下载方法 win32/mongodb-win32-x86_64- ...