C# 各种导出的方法总结
程序员文章站
2023-11-12 19:24:58
第一种:使用 microsoft.office.interop.excel.dll
首先需要安装 office 的 excel,然后再找到 microsoft.offic...
第一种:使用 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 的设计。它在只读数据库中”,那就去掉这个,问题解决。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!