导入Microsoft.Office.Interop.Excel.dll文件引用
为了能够导出excel文件,由于使用的是Microsoft.Office.Interop.Excel,所以我们首先要确保自己的计算机上需要安装有office应用程序,然后导入Microsoft.Office.Interop.Excel.dll程序集到我们的工程中。
1. 找到Microsoft.Office.Interop.Excel.dll文件所在位置
可以利用文件搜索软件在本地进行查找,看能不能找到,如果没有找到的话可以尝试上网搜索一下,或者可以找到。
本人的文件所在路径如下, 没找到的话也可以按照这个路径尝试找下。
C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\14.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
2. 添加引用
右键解决方案资源管理器的引用 > 添加引用 > 浏览 > 按照所在路径进行找到dll文件添加即可。 在工程中使用方法如下:
//using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
在程序中使用
1. 启动应用(Application)
Excel.Application xlApp = new Excel.Application();
2. 创建文件(Workbook)
Excel.Workbooks workbooks = xlApp.Workbooks;
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
3. 创建工作表(Worksheet)
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
4. 添加内容
worksheet.Cells[1,1] = "第1行第1列的内容,没有第0行或者第0列";
5. 显示生成的excel文件
xlApp.Visible = true;
一个需要注意的重要内容
我们使用的保存文件语句,必须指定文件格式FormatNum,否则所创建的文件就无法正常打开,也就是会弹出如下错误提示:
所以我们用 workbook.SaveAs(filePath,FormatNum)
语句保存文件的,而不用workbook.SaveAs(filePath)
。
根据不同版本的Excel应用程序,所获得的FormatNum会有所不同。
//获取你使用的excel 的版本号
Version = xlApp.Version;
//使用Excel 97-2003
if (Convert.ToDouble(Version) < 12)
{
FormatNum = -4143;
}
//使用excel 2007或者更新
else
{
FormatNum = 56;
}
除了添加FormatNum的方法避免弹出错误,博主还发现,对于不同版本的Excel应用程序,使用不同的拓展名也可以解决该文件。博主使用的是office 2010,即使不指定FormatNum,只要使用拓展名xlsx
还是可以正常打开文件的,而使用拓展名xls
就会报错。而指定FormatNum,对不同的拓展名均可正常打开。由于不同用户使用的版本可能不同,所以我们还是需要对xlApp.Version
进行判断。
完整的代码
using System;
using System.IO;
using System.Collections;
using Excel = Microsoft.Office.Interop.Excel;
namespace algorithm
{
class ExcelExporter
{
private const int OLDOFFICEVESION = -4143;
private const int NEWOFFICEVESION = 56;
public void exportToExcel(ArrayList dataArray, string filePath)
{
//保存excel文件的格式
int FormatNum;
//excel版本号
string Version;
//启动应用
Excel.Application xlApp = new Excel.Application();
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Excel.Workbooks workbooks = xlApp.Workbooks;
//创建文件
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
//创建sheet
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
//获取你使用的excel 的版本号
Version = xlApp.Version;
//使用Excel 97-2003
if (Convert.ToDouble(Version) < 12)
{
FormatNum = OLDOFFICEVESION;
}
//使用 excel 2007或更新
else
{
FormatNum = NEWOFFICEVESION;
}
//添加输出excel表格的表头信息信息
//注意这里的excel对应的单元格第一个位置为[1,1],而不是我们平时定义[0,0]
ArrayList head = (ArrayList)dataArray[0];
for (int i = 0; i < head.Count; i++)
{
worksheet.Cells[1, i + 1] = head[i].ToString();
}
//添加输出excel表格的内容信息
for (int rowIndex = 1; rowIndex < dataArray.Count; rowIndex++)
{
ArrayList rowArr = (ArrayList)dataArray[rowIndex];
for (int cellIndex = 0; cellIndex < rowArr.Count; cellIndex++)
{
worksheet.Cells[rowIndex + 1, cellIndex + 1] = rowArr[cellIndex].ToString();
}
}
//删除已存在的excel文件,否则会无法保存创建的excel文件
if (File.Exists(filePath))
{
try{
File.Delete(filePath);
}
catch(IOException e)
{
Console.WriteLine(e.Message);
}
}
//保存,这里必须指定FormatNum文件的格式,否则无法打开创建的excel文件
workbook.SaveAs(filePath, FormatNum);
//显示创建的excel文件
xlApp.Visible = true;
}
//测试函数
public void test()
{
ArrayList perant = new ArrayList();
ArrayList head = new ArrayList();
head.Add("头部");
perant.Add(head);
ArrayList data = new ArrayList();
data.Add("data");
perant.Add(data);
exportToExcel(perant, @"D:\testExcell.xlsx");
}
}
}
写一个主程序,使用ExcelExporter
对象调用函数test()
即可得到如下的结果:
除了使用Microsoft.Office.Interop.Excel程序集导出excel文件,我们还可以使用NPOI进行导出,会更加灵活方便,而且不要求安装有Excel应用程序。不过这里需要注意的是对于拓展名为xls
的文件,需要使用HSSF
,而对于拓展名为xlsx
的文件则需要使用XSSF
,否则就会出现之前的错误。