让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;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。