问题描述
Microsoft.Office.Interop.Excel.dll我调用这个类库privatevoidExcelDataTable(DataTabledt){if(dt==null||dt.Rows.Count==0)return;//*****此时使用Application,而不是ApplicationClassMicrosoft.Office.Interop.Excel.ApplicationxlApp=newMicrosoft.Office.Interop.Excel.Application();if(xlApp==null)return;Microsoft.Office.Interop.Excel.Workbooksworkbooks=xlApp.Workbooks;//Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheetMicrosoft.Office.Interop.Excel.Workbookworkbook=workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheetworksheet=(Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];Microsoft.Office.Interop.Excel.Rangerange1;for(inti=0;i<dt.Columns.Count;i++){worksheet.Cells[1,i+1]=dt.Columns[i].ColumnName;range1=(Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1,i+1];//range.Interior.ColorIndex=15;range1.Columns.AutoFit();range1.Font.Bold=true;}for(intr=0;r<dt.Rows.Count;r++)for(inti=0;i<dt.Columns.Count;i++){worksheet.Cells[r+2,i+1]=dt.Rows[r][i].ToString();}Microsoft.Office.Interop.Excel.Rangerange2=worksheet.get_Range(worksheet.Cells[1,1],worksheet.Cells[dt.Rows.Count+1,dt.Columns.Count]);range2.Columns.AutoFit();//服务器端直接打开文件//xlApp.Visible=true;//workbook.Saved=true;workbook.SaveAs("C:\Users\wyl\Desktop\table.xlsx");//workbook.SaveCopyAs("C:\Users\wyl\Desktop\table.xlsx");//释放excel资源workbook.Close(true,Type.Missing,Type.Missing);workbook=null;xlApp.Quit();xlApp=null;}在页面后台,把datatable的数据放入到新的workbook里后然后保存到指定路径,我就做到这里,也没什么问题现在的问题是页面前台查询完成后,显示表结果,然后点导出Excel在客户端导出excel(也就是下载查询结果生成的excel),是不是必须先保存到服务器端,再下载??如果是这样的话,那么下载一万次,服务器端就有1w个文件了。。我是希望在后台DataTable生成excel后,直接输出到客户端下载
解决方案
解决方案二:
stringfileName=HttpUtility.UrlEncode("Excel文件名为中文哦.xls");Response.Clear();Response.Buffer=true;Response.AppendHeader("Content-Disposition","attachment;filename="+fileName);Response.ContentEncoding=System.Text.Encoding.UTF8;Response.ContentType="application/vnd.ms-excel";this.EnableViewState=false;
解决方案三:
引用1楼guwei4037的回复:
stringfileName=HttpUtility.UrlEncode("Excel文件名为中文哦.xls");Response.Clear();Response.Buffer=true;Response.AppendHeader("Content-Disposition","attachment;filename="+fileName);Response.ContentEncoding=System.Text.Encoding.UTF8;Response.ContentType="application/vnd.ms-excel";this.EnableViewState=false;
怎么获取后台的workbook呢
解决方案四:
LZ用的技术属于com范畴;一般b/s结构的程序,不使用这样的技术,微软后来出现了openxml这样的技术,并且提供相应的类库。codeproject、github一般都有源码;在msdn官方文档是有相关资料:https://msdn.microsoft.com/en-us/library/office/bb448854.aspx
解决方案五:
我现在就用这种方法,貌似就差一步
解决方案六:
可以这样做,每次导出都生成一个文件,下载完成以后删除
解决方案七:
引用5楼ymq_2012的回复:
可以这样做,每次导出都生成一个文件,下载完成以后删除
下载完是客户端,服务器端怎么判断
解决方案八:
privatevoidExcelDataTable(DataTabledt){if(dt==null||dt.Rows.Count==0)return;//*****此时使用Application,而不是ApplicationClassMicrosoft.Office.Interop.Excel.ApplicationxlApp=newMicrosoft.Office.Interop.Excel.Application();if(xlApp==null)return;Microsoft.Office.Interop.Excel.Workbooksworkbooks=xlApp.Workbooks;//Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheetMicrosoft.Office.Interop.Excel.Workbookworkbook=workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheetworksheet=(Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];Microsoft.Office.Interop.Excel.Rangerange1;for(inti=0;i<dt.Columns.Count;i++){worksheet.Cells[1,i+1]=dt.Columns[i].ColumnName;range1=(Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1,i+1];//range.Interior.ColorIndex=15;range1.Columns.AutoFit();range1.Font.Bold=true;}for(intr=0;r<dt.Rows.Count;r++)for(inti=0;i<dt.Columns.Count;i++){worksheet.Cells[r+2,i+1]=dt.Rows[r][i].ToString();}Microsoft.Office.Interop.Excel.Rangerange2=worksheet.get_Range(worksheet.Cells[1,1],worksheet.Cells[dt.Rows.Count+1,dt.Columns.Count]);range2.Columns.AutoFit();//服务器端直接打开文件//xlApp.Visible=true;//workbook.Saved=true;workbook.SaveAs("C:\Users\wyl\Desktop\table.xlsx");//workbook.SaveCopyAs("C:\Users\wyl\Desktop\table.xlsx");//释放excel资源workbook.Close(true,Type.Missing,Type.Missing);workbook=null;xlApp.Quit();xlApp=null;}
解决方案九:
https://github.com/jmaister/excellentexport用这个js就解决问题了.没必要那么麻烦,还的服务器在查询一次,在保存,在删除的,js是读取的网页上面的table,table是什么样的,保持下来就是什么样的.