让C# Excel导入导出 支持不同版本Office
问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误。
找不到ExcelCom组件,错误信息如下。
未能加载文件或程序集“Microsoft.Office.Interop.Excel,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。系统找不到指定的文件。
解决方法:
1.引用高版本的的Excel.dll组件,最新版本14.0.0防止客户安装高版本如Office不能导出。
(DLL组件可以兼容低版本,不能兼容高版本)
2.右键DLL属性,将引用的Excel.dll组件,嵌入互操作类型为True,特定版本=false.这一步非常关键。
嵌入互操作类型改成True后,生成时可能现有调用Excel的代码会报错,引用Microsoft.CSharp命名空间,可以解决此问题。
3.引用Excel14.0.0DLL组件方法,vs2012右键添加引用->程序集->扩展->Microsoft.Office.Interop.Excel
Excel.dll: http://xiazai.jb51.net/201608/yuanma/Excel(jb51.net).rar
其他方法:
1.使用NPOI.DLL开源组件,可以不安装Office软件,进行读写Excel文件。
NPIO.dll: http://xiazai.jb51.net/201608/yuanma/NPOI(jb51.net).rar
调用方法如下:
导出代码:
///<summary>
///DataTable导出到Excel的MemoryStreamExport()
///</summary>
///<paramname="dtSource">DataTable数据源</param>
///<paramname="strHeaderText">Excel表头文本(例如:车辆列表)</param>
publicstaticMemoryStreamExport(DataTabledtSource,stringstrHeaderText)
{
HSSFWorkbookworkbook=newHSSFWorkbook();
ISheetsheet=workbook.CreateSheet();
#region右击文件属性信息
{
DocumentSummaryInformationdsi=PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company="NPOI";
workbook.DocumentSummaryInformation=dsi;
SummaryInformationsi=PropertySetFactory.CreateSummaryInformation();
si.Author="文件作者信息";//填加xls文件作者信息
si.ApplicationName="创建程序信息";//填加xls文件创建程序信息
si.LastAuthor="最后保存者信息";//填加xls文件最后保存者信息
si.Comments="作者信息";//填加xls文件作者信息
si.Title="标题信息";//填加xls文件标题信息
si.Subject="主题信息";//填加文件主题信息
si.CreateDateTime=System.DateTime.Now;
workbook.SummaryInformation=si;
}
#endregion
ICellStyledateStyle=workbook.CreateCellStyle();
IDataFormatformat=workbook.CreateDataFormat();
dateStyle.DataFormat=format.GetFormat("yyyy-mm-dd");
//取得列宽
int[]arrColWidth=newint[dtSource.Columns.Count];
foreach(DataColumnitemindtSource.Columns)
{
arrColWidth[item.Ordinal]=Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
}
for(inti=0;i<dtSource.Rows.Count;i++)
{
for(intj=0;j<dtSource.Columns.Count;j++)
{
intintTemp=Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
if(intTemp>arrColWidth[j])
{
arrColWidth[j]=intTemp;
}
}
}
introwIndex=0;
foreach(DataRowrowindtSource.Rows)
{
#region新建表,填充表头,填充列头,样式
if(rowIndex==65535||rowIndex==0)
{
if(rowIndex!=0)
{
sheet=workbook.CreateSheet();
}
#region表头及样式
{
IRowheaderRow=sheet.CreateRow(0);
headerRow.HeightInPoints=25;
headerRow.CreateCell(0).SetCellValue(strHeaderText);
ICellStyleheadStyle=workbook.CreateCellStyle();
headStyle.Alignment=HorizontalAlignment.CENTER;
IFontfont=workbook.CreateFont();
font.FontHeightInPoints=20;
font.Boldweight=700;
headStyle.SetFont(font);
headerRow.GetCell(0).CellStyle=headStyle;
sheet.AddMergedRegion(newNPOI.SS.Util.CellRangeAddress(0,0,0,dtSource.Columns.Count-1));
}
#endregion
#region列头及样式
{
IRowheaderRow=sheet.CreateRow(1);
ICellStyleheadStyle=workbook.CreateCellStyle();
headStyle.Alignment=HorizontalAlignment.CENTER;
IFontfont=workbook.CreateFont();
font.FontHeightInPoints=10;
font.Boldweight=700;
headStyle.SetFont(font);
foreach(DataColumncolumnindtSource.Columns)
{
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
headerRow.GetCell(column.Ordinal).CellStyle=headStyle;
//设置列宽
sheet.SetColumnWidth(column.Ordinal,(arrColWidth[column.Ordinal]+1)*256);
}
}
#endregion
rowIndex=2;
}
#endregion
#region填充内容
IRowdataRow=sheet.CreateRow(rowIndex);
foreach(DataColumncolumnindtSource.Columns)
{
ICellnewCell=dataRow.CreateCell(column.Ordinal);
stringdrValue=row[column].ToString();
switch(column.DataType.ToString())
{
case"System.String"://字符串类型
newCell.SetCellValue(drValue);
break;
case"System.DateTime"://日期类型
System.DateTimedateV;
System.DateTime.TryParse(drValue,outdateV);
newCell.SetCellValue(dateV);
newCell.CellStyle=dateStyle;//格式化显示
break;
case"System.Boolean"://布尔型
boolboolV=false;
bool.TryParse(drValue,outboolV);
newCell.SetCellValue(boolV);
break;
case"System.Int16"://整型
case"System.Int32":
case"System.Int64":
case"System.Byte":
intintV=0;
int.TryParse(drValue,outintV);
newCell.SetCellValue(intV);
break;
case"System.Decimal"://浮点型
case"System.Double":
doubledoubV=0;
double.TryParse(drValue,outdoubV);
newCell.SetCellValue(doubV);
break;
case"System.DBNull"://空值处理
newCell.SetCellValue("");
break;
default:
newCell.SetCellValue("");
break;
}
}
#endregion
rowIndex++;
}
using(MemoryStreamms=newMemoryStream())
{
workbook.Write(ms);
ms.Flush();
ms.Position=0;
sheet.Dispose();
returnms;
}
}
导入代码:
///<summary>
///读取excel,默认第一行为标头
///</summary>
///<paramname="strFileName">excel文档路径</param>
///<returns></returns>
publicstaticDataTableImport(stringstrFileName)
{
DataTabledt=newDataTable();
HSSFWorkbookhssfworkbook;
using(FileStreamfile=newFileStream(strFileName,FileMode.Open,FileAccess.Read))
{
hssfworkbook=newHSSFWorkbook(file);
}
ISheetsheet=hssfworkbook.GetSheetAt(0);
System.Collections.IEnumeratorrows=sheet.GetRowEnumerator();
IRowheaderRow=sheet.GetRow(0);
intcellCount=headerRow.LastCellNum;
for(intj=0;j<cellCount;j++)
{
ICellcell=headerRow.GetCell(j);
dt.Columns.Add(cell.ToString());
}
for(inti=(sheet.FirstRowNum+1);i<=sheet.LastRowNum;i++)
{
IRowrow=sheet.GetRow(i);
DataRowdataRow=dt.NewRow();
for(intj=row.FirstCellNum;j<cellCount;j++)
{
if(row.GetCell(j)!=null)
dataRow[j]=row.GetCell(j).ToString();
}
dt.Rows.Add(dataRow);
}
returndt;
}
2.使用C#发射方式调用Excel进行,不需要引用Excel.dll组件。此种方法不建议,太麻烦,也需要安装Office。
调用方法如下:
privatevoidExport2Excel(DataGridViewdatagridview,boolcaptions)
{
objectobjApp_Late;
objectobjBook_Late;
objectobjBooks_Late;
objectobjSheets_Late;
objectobjSheet_Late;
objectobjRange_Late;
object[]Parameters;
string[]headers=newstring[datagridview.DisplayedColumnCount(true)];
string[]columns=newstring[datagridview.DisplayedColumnCount(true)];
string[]colName=newstring[datagridview.DisplayedColumnCount(true)];
inti=0;
intc=0;
intm=0;
for(c=0;c<datagridview.Columns.Count;c++)
{
for(intj=0;j<datagridview.Columns.Count;j++)
{
DataGridViewColumntmpcol=datagridview.Columns[j];
if(tmpcol.DisplayIndex==c)
{
if(tmpcol.Visible)//不显示的隐藏列初始化为tag=0
{
headers[c-m]=tmpcol.HeaderText;
i=c-m+65;
columns[c-m]=Convert.ToString((char)i);
colName[c-m]=tmpcol.Name;
}
else
{
m++;
}
break;
}
}
}
try
{
//GettheclasstypeandinstantiateExcel.
TypeobjClassType;
objClassType=Type.GetTypeFromProgID("Excel.Application");
objApp_Late=Activator.CreateInstance(objClassType);
//Gettheworkbookscollection.
objBooks_Late=objApp_Late.GetType().InvokeMember("Workbooks",BindingFlags.GetProperty,null,objApp_Late,null);
//Addanewworkbook.
objBook_Late=objBooks_Late.GetType().InvokeMember("Add",BindingFlags.InvokeMethod,null,objBooks_Late,null);
//Gettheworksheetscollection.
objSheets_Late=objBook_Late.GetType().InvokeMember("Worksheets",BindingFlags.GetProperty,null,objBook_Late,null);
//Getthefirstworksheet.
Parameters=newObject[1];
Parameters[0]=1;
objSheet_Late=objSheets_Late.GetType().InvokeMember("Item",BindingFlags.GetProperty,null,objSheets_Late,Parameters);
if(captions)
{
//Createtheheadersinthefirstrowofthesheet
for(c=0;c<datagridview.DisplayedColumnCount(true);c++)
{
//Getarangeobjectthatcontainscell.
Parameters=newObject[2];
Parameters[0]=columns[c]+"1";
Parameters[1]=Missing.Value;
objRange_Late=objSheet_Late.GetType().InvokeMember("Range",BindingFlags.GetProperty,null,objSheet_Late,Parameters);
//WriteHeadersincell.
Parameters=newObject[1];
Parameters[0]=headers[c];
objRange_Late.GetType().InvokeMember("Value",BindingFlags.SetProperty,null,objRange_Late,Parameters);
}
}
//Nowaddthedatafromthegridtothesheetstartinginrow2
for(i=0;i<datagridview.RowCount;i++)
{
c=0;
foreach(stringtxtColincolName)
{
DataGridViewColumncol=datagridview.Columns[txtCol];
if(col.Visible)
{
//Getarangeobjectthatcontainscell.
Parameters=newObject[2];
Parameters[0]=columns[c]+Convert.ToString(i+2);
Parameters[1]=Missing.Value;
objRange_Late=objSheet_Late.GetType().InvokeMember("Range",BindingFlags.GetProperty,null,objSheet_Late,Parameters);
//WriteHeadersincell.
Parameters=newObject[1];
//Parameters[0]=datagridview.Rows[i].Cells[headers[c]].Value.ToString();
Parameters[0]=datagridview.Rows[i].Cells[col.Name].Value.ToString();
objRange_Late.GetType().InvokeMember("Value",BindingFlags.SetProperty,null,objRange_Late,Parameters);
c++;
}
}
}
//ReturncontrolofExceltotheuser.
Parameters=newObject[1];
Parameters[0]=true;
objApp_Late.GetType().InvokeMember("Visible",BindingFlags.SetProperty,
null,objApp_Late,Parameters);
objApp_Late.GetType().InvokeMember("UserControl",BindingFlags.SetProperty,
null,objApp_Late,Parameters);
}
catch(ExceptiontheException)
{
StringerrorMessage;
errorMessage="Error:";
errorMessage=String.Concat(errorMessage,theException.Message);
errorMessage=String.Concat(errorMessage,"Line:");
errorMessage=String.Concat(errorMessage,theException.Source);
MessageBox.Show(errorMessage,"Error");
}
}
System.TypeExcelType=System.Type.GetTypeFromProgID("Excel.Application");
Microsoft.Office.Interop.Excel.Applicationobj=Activator.CreateInstance(ExcelType)asMicrosoft.Office.Interop.Excel.Application;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。