本篇文章主要介绍了c# 各种导出方法的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
第一种:使用 microsoft.office.interop.excel.dll
首先需要安装 office 的 excel,然后再找到 microsoft.office.interop.excel.dll 组件,添加到引用。
public void exportexcel(datatable dt)
{
if (dt != null)
{
microsoft.office.interop.excel.application excel = new microsoft.office.interop.excel.application();
if (excel == null)
{
return;
}
//设置为不可见,操作在后台执行,为 true 的话会打开 excel
excel.visible = false;
//打开时设置为全屏显式
//excel.displayfullscreen = true;
//初始化工作簿
microsoft.office.interop.excel.workbooks workbooks = excel.workbooks;
//新增加一个工作簿,add()方法也可以直接传入参数 true
microsoft.office.interop.excel.workbook workbook = workbooks.add(microsoft.office.interop.excel.xlwbatemplate.xlwbatworksheet);
//同样是新增一个工作簿,但是会弹出保存对话框
//microsoft.office.interop.excel.workbook workbook = excel.application.workbooks.add(true);
//新增加一个 excel 表(sheet)
microsoft.office.interop.excel.worksheet worksheet = (microsoft.office.interop.excel.worksheet)workbook.worksheets[1];
//设置表的名称
worksheet.name = dt.tablename;
try
{
//创建一个单元格
microsoft.office.interop.excel.range range;
int rowindex = 1; //行的起始下标为 1
int colindex = 1; //列的起始下标为 1
//设置列名
for (int i = 0; i < dt.columns.count; i++)
{
//设置第一行,即列名
worksheet.cells[rowindex, colindex + i] = dt.columns[i].columnname;
//获取第一行的每个单元格
range = worksheet.cells[rowindex, colindex + i];
//设置单元格的内部颜色
range.interior.colorindex = 33;
//字体加粗
range.font.bold = true;
//设置为黑色
range.font.color = 0;
//设置为宋体
range.font.name = "arial";
//设置字体大小
range.font.size = 12;
//水平居中
range.horizontalalignment = microsoft.office.interop.excel.xlhalign.xlhaligncenter;
//垂直居中
range.verticalalignment = microsoft.office.interop.excel.xlvalign.xlvaligncenter;
}
//跳过第一行,第一行写入了列名
rowindex++;
//写入数据
for (int i = 0; i < dt.rows.count; i++)
{
for (int j = 0; j < dt.columns.count; j++)
{
worksheet.cells[rowindex + i, colindex + j] = dt.rows[i][j].tostring();
}
}
//设置所有列宽为自动列宽
//worksheet.columns.autofit();
//设置所有单元格列宽为自动列宽
worksheet.cells.columns.autofit();
//worksheet.cells.entirecolumn.autofit();
//是否提示,如果想删除某个sheet页,首先要将此项设为fasle。
excel.displayalerts = false;
//保存写入的数据,这里还没有保存到磁盘
workbook.saved = true;
//设置导出文件路径
string path = httpcontext.current.server.mappath("export/");
//设置新建文件路径及名称
string savepath = path + datetime.now.tostring("yyyy-mm-dd-hh-mm-ss") + ".xlsx";
//创建文件
filestream file = new filestream(savepath, filemode.createnew);
//关闭释放流,不然没办法写入数据
file.close();
file.dispose();
//保存到指定的路径
workbook.savecopyas(savepath);
//还可以加入以下方法输出到浏览器下载
fileinfo fileinfo = new fileinfo(savepath);
outputclient(fileinfo);
}
catch(exception ex)
{
}
finally
{
workbook.close(false, type.missing, type.missing);
workbooks.close();
//关闭退出
excel.quit();
//释放 com 对象
marshal.releasecomobject(worksheet);
marshal.releasecomobject(workbook);
marshal.releasecomobject(workbooks);
marshal.releasecomobject(excel);
worksheet = null;
workbook = null;
workbooks = null;
excel = null;
gc.collect();
}
}
}
public void outputclient(fileinfo file)
{
httpcontext.current.response.buffer = true;
httpcontext.current.response.clear();
httpcontext.current.response.clearheaders();
httpcontext.current.response.clearcontent();
httpcontext.current.response.contenttype = "application/vnd.ms-excel";
//导出到 .xlsx 格式不能用时,可以试试这个
//httpcontext.current.response.contenttype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
httpcontext.current.response.addheader("content-disposition", string.format("attachment; filename={0}.xlsx", datetime.now.tostring("yyyy-mm-dd-hh-mm")));
httpcontext.current.response.charset = "gb2312";
httpcontext.current.response.contentencoding = encoding.getencoding("gb2312");
httpcontext.current.response.addheader("content-length", file.length.tostring());
httpcontext.current.response.writefile(file.fullname);
httpcontext.current.response.flush();
httpcontext.current.response.close();
}
第一种方法性能实在是不敢恭维,而且局限性太多。首先必须要安装 office(如果计算机上面没有的话),而且导出时需要指定文件保存的路径。也可以输出到浏览器下载,当然前提是已经保存写入数据。
第二种:使用 aspose.cells.dll
这个 aspose.cells 是 aspose 公司推出的导出 excel 的控件,不依赖 office,商业软件,收费的。
public void exportexcel(datatable dt)
{
try
{
//获取指定虚拟路径的物理路径
string path = httpcontext.current.server.mappath("dll/") + "license.lic";
//读取 license 文件
stream stream = (stream)file.openread(path);
//注册 license
aspose.cells.license li = new aspose.cells.license();
li.setlicense(stream);
//创建一个工作簿
aspose.cells.workbook workbook = new aspose.cells.workbook();
//创建一个 sheet 表
aspose.cells.worksheet worksheet = workbook.worksheets[0];
//设置 sheet 表名称
worksheet.name = dt.tablename;
aspose.cells.cell cell;
int rowindex = 0; //行的起始下标为 0
int colindex = 0; //列的起始下标为 0
//设置列名
for (int i = 0; i < dt.columns.count; i++)
{
//获取第一行的每个单元格
cell = worksheet.cells[rowindex, colindex + i];
//设置列名
cell.putvalue(dt.columns[i].columnname);
//设置字体
cell.style.font.name = "arial";
//设置字体加粗
cell.style.font.isbold = true;
//设置字体大小
cell.style.font.size = 12;
//设置字体颜色
cell.style.font.color = system.drawing.color.black;
//设置背景色
cell.style.backgroundcolor = system.drawing.color.lightgreen;
}
//跳过第一行,第一行写入了列名
rowindex++;
//写入数据
for (int i = 0; i < dt.rows.count; i++)
{
for (int j = 0; j < dt.columns.count; j++)
{
cell = worksheet.cells[rowindex + i, colindex + j];
cell.putvalue(dt.rows[i][j]);
}
}
//自动列宽
worksheet.autofitcolumns();
//设置导出文件路径
path = httpcontext.current.server.mappath("export/");
//设置新建文件路径及名称
string savepath = path + datetime.now.tostring("yyyy-mm-dd-hh-mm-ss") + ".xlsx";
//创建文件
filestream file = new filestream(savepath, filemode.createnew);
//关闭释放流,不然没办法写入数据
file.close();
file.dispose();
//保存至指定路径
workbook.save(savepath);
//或者使用下面的方法,输出到浏览器下载。
//byte[] bytes = workbook.savetostream().toarray();
//outputclient(bytes);
worksheet = null;
workbook = null;
}
catch(exception ex)
{
}
}
public void outputclient(byte[] bytes)
{
httpcontext.current.response.buffer = true;
httpcontext.current.response.clear();
httpcontext.current.response.clearheaders();
httpcontext.current.response.clearcontent();
httpcontext.current.response.contenttype = "application/vnd.ms-excel";
httpcontext.current.response.addheader("content-disposition", string.format("attachment; filename={0}.xls", datetime.now.tostring("yyyy-mm-dd-hh-mm")));
httpcontext.current.response.charset = "gb2312";
httpcontext.current.response.contentencoding = encoding.getencoding("gb2312");
httpcontext.current.response.binarywrite(bytes);
httpcontext.current.response.flush();
httpcontext.current.response.close();
}
第二种方法性能还不错,而且操作也不复杂,可以设置导出时文件保存的路径,还可以保存为流输出到浏览器下载。
第三种:microsoft.jet.oledb
这种方法操作 excel 类似于操作数据库。下面先介绍一下连接字符串:
// 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 的设计。它在只读数据库中”,那就去掉这个,问题解决。
以上就是c#中关于各种导出的方法介绍的详细内容。
