这是导出Excel的其中一种方法,由于这个是将字符串(html中的<table></table>)直接写到Excel文件中的,所以相对来说比较高效。但是,在用的时候有这样一个问题
当导出来后保存的时候,会同时出现一个.files的文件夹,这里主要也就是解决了这个问题,不多说了,贴代码:
public static string ExportExcel(DataTable dt)
{
string downLoadPagePath = "";
try
{
int iCounter = 0;
string now = DateTime.Now.ToString("yyyyMMddhhmmssfff");
string sFileNewName = DateTime.Now.ToString("yyyyMM") + "\\" + now;
//获取绝对目录
string downLoadPath = System.Web.Hosting.HostingEnvironment.MapPath("\\") + @"\FileDownLoad\" + DateTime.Now.ToString("yyyyMM");
//确定是否有文件目录,没有就添加
if (!System.IO.Directory.Exists(downLoadPath))
{
System.IO.DirectoryInfo di = System.IO.Directory.CreateDirectory(downLoadPath);
}
string sMapPath = downLoadPath + "\\" + now + ".xls";
//下载文件时使用的路径
string ServerPath = @"\FileDownLoad\" + DateTime.Now.ToString("yyyyMM") + "\\" + now + ".xls";
#region MyRegion
//表标题
System.Text.StringBuilder sb = new StringBuilder();
sb.Append("<html xmlns:x='urn:schemas-microsoft-com:office:excel'>");
sb.Append("<head>");
sb.Append(@"<!--[if gte mso 9]><xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>Sheet1</x:Name>
<x:WorksheetOptions>
<x:Print>
<x:ValidPrinterInfo />
</x:Print>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
<![endif]-->");
sb.Append("</head>");
//--------------------------------------------------------------------------------------------------
sb.Append("<body>");
sb.Append(BuildTable(dt));
sb.Append("</body></html>");
//生成html文件
//string abcd = sb.ToString();
if (File.Exists(sMapPath))
{
File.Delete(sMapPath);
}
FileStream fs = new FileStream(sMapPath, FileMode.Create);
StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
sw.Write(sb.ToString());
fs.Flush();
sw.Close();
fs.Close();
#endregion
#region 打开一下这个Excel,然后另存一个位置,这样来解决保存时样式的问题
//空对象,下面会用到。
object missing = System.Reflection.Missing.Value;
//创建对象
Microsoft.Office.Interop.Excel.Application Myexcel = new Microsoft.Office.Interop.Excel.ApplicationClass();//注意这里,需要将Microsoft.Office.Interop.Excel这个引用的“嵌入互操作类型”的值为false
//打开源excel,用到了上面的missing
Microsoft.Office.Interop.Excel._Workbook xBk = Myexcel.Workbooks._Open(sMapPath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
Microsoft.Office.Interop.Excel._Worksheet xSt = (Microsoft.Office.Interop.Excel._Worksheet)xBk.Worksheets[1];//读取第一个Sheet
string saveAsPath = System.Web.Hosting.HostingEnvironment.MapPath("\\") + @"FileDownLoadSaveAs\" + DateTime.Now.ToString("yyyyMM") + "\\";
if (!Directory.Exists(saveAsPath))
Directory.CreateDirectory(saveAsPath);
string saveAsFileName = now + ".xls";
string saveAsFullPath = saveAsPath + saveAsFileName;
string saveAsServerPath = @"\\FileDownLoadSaveAs\\" + DateTime.Now.ToString("yyyyMM") + "\\" + now + ".xls";
xBk.SaveAs(saveAsFullPath, missing, missing, missing, missing, missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, missing, missing, missing, missing, false);
Myexcel.Quit();
xBk = null;
Myexcel = null;
#endregion
downLoadPagePath = "DownLoadPage.aspx?filepath=" + saveAsServerPath;
}
catch (Exception ex)
{
throw ex;
}
finally
{
Process[] procs = Process.GetProcessesByName("excel");
foreach (Process pro in procs)
{
pro.Kill();//杀掉进程
}
GC.Collect();
}
return downLoadPagePath;
}
private static string BuildTable(DataTable dt)
{
StringBuilder sb = new StringBuilder("<table>");
sb.Append("<tr>");
//表头
foreach (DataColumn column in dt.Columns)
{
sb.Append("<td>" + column.ColumnName + "</td>");
}
sb.Append("</tr>");
//表内容
foreach (DataRow row in dt.Rows)
{
sb.Append("<tr>");
for (int i = 0; i < dt.Columns.Count; i++)
{
sb.Append("<td>" + row[i].ToString() + "</td>");
}
sb.Append("</tr>");
}
sb.Append("</table>");
return sb.ToString();
}
下面附加C#操作Excel SaveAS方法参数详解,这个转自http://www.deyangdianzi.com/zblog/post/%E7%BC%96%E7%A8%8B%E5%A4%A9%E5%9C%B0/C-CaoZuoExcel-SaveASFangFaCanShuXiangJie.html
C#操作Excel用的SaveAS方法参数详解:
ExcelApplication.WorkBook.SaveAs(filename,FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout ,Local)
1、Filename: Variant 类型,可选。该字符串表示要保存的文件名。可包含完整路径。如果不指定路径,Microsoft Excel 将文件保存到当前文件夹中。
2、FileFormat: Variant 类型,可选。保存文件时使用的文件格式。要得到有效选项的列表,请参阅 FileFormat 属性。对于已有文件,其默认格式是上次指定的文件格式;对于新文件,默认格式为当前使用的 Excel 版本格式 ,可选常数如下:
xlAddIn 18
xlCSV 6
xlCSVMac 22
xlCSVMSDOS 24
xlCSVWindows 23
xlCurrentPlatformText -4158
xlDBF2 7
xlDBF3 8
xlDBF4 11
xlDIF 9
xlExcel2 16
xlExcel2FarEast 27
xlExcel3 29
xlExcel4 33
xlExcel4Workbook 35
xlExcel5 39
xlExcel7 39
xlExcel9795 43
xlHtml 44
xlIntlAddIn 26
xlIntlMacro 25
xlSYLK 2
xlTemplate 17
xlTextMac 19
xlTextMSDOS 21
xlTextPrinter 36
xlTextWindows 20
xlUnicodeText 42
xlWebArchive 45
xlWJ2WD1 14
xlWJ3 40
xlWJ3FJ3 41
xlWK1 5
xlWK1ALL 31
xlWK1FMT 30
xlWK3 15
xlWK3FM3 32
xlWK4 38
xlWKS 4
xlWorkbookNormal -4143
xlWorks2FarEast 28
xlWQ1 34
xlXMLData 47
xlXMLSpreadsheet 46
3、Password :Variant 类型,可选。它是一个区分大小写的字符串(最长不超过 15 个字符),用于指定文件的保护密码。
4、WriteResPassword :Variant 类型,可选。该字符串表示文件的写保护密码。如果文件保存时带有密码,但打开文件时不输入密码,则该文件以只读方式打开。
5、ReadOnlyRecommended : Variant 类型,可选。如果该值为 True,则在打开文件时显示一条信息,提示该文件以只读方式打开。
6、CreateBackup: Variant 类型,可选。如果该值为 True,则创建备份文件。
7、AccessMode :XlSaveAsAccessMode 类型,可选,如果省略此参数,则不会更改访问方式。如果在没有改变文件名的情况下保存共享列表,则可以忽略参数。若要改变访问方式,请使用 ExclusiveAccess 方法。 以下是可选常量:
xlExclusive 3 不含方式
xlNoChange 1 不更改访问方式,缺省值
xlShared 2 共享列表
8、ConflictResolution : XlSaveConflictResolution 类型,如果忽略本参数,则显示冲突处理对话框。可选常量如下:
xlLocalSessionChanges 2 自动接受本地用户的修改
xlOtherSessionChanges 3 接受除本地用户之外的其他用户的更改
xlUserResolution 1 显示冲突解决方案对话框
9、AddToMru :Variant 类型,可选。如果该值为 True ,则将该工作簿添加到最近使用的文件列表中。默认值为 False。
10、TextCodePage :Variant 类型,可选。不在美国英语版的 Microsoft Excel 中使用。
11、TextVisualLayout :Variant 类型,可选。不在美国英语版的 Microsoft Excel 中使用。
12、Local :Variant 类型,可选。如果该值为 True,则以 Microsoft Excel(包括控制面板设置)的语言保存文件。如果该值为 False(默认值),则以 Visual Basic for Applications (VBA) 的语言保存文件,其中 Visual Basic for Applications (VBA) 为典型安装的美国英语版本,除非 VBA 项目中的 Workbooks.Open 来自旧的国际化的 XL5/95 VBA 项目