亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

讓C# Excel導入導出 支持不同版本Office

2020-01-24 01:00:23
字體:
來源:轉載
供稿:網友

問題:最近在項目中遇到,不同客戶機安裝不同Office版本,在導出Excel時,發生錯誤。
找不到Excel Com組件,錯誤信息如下。 
未能加載文件或程序集“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.引用Excel 14.0.0 DLL組件方法,vs2012 右鍵添加引用->程序集->擴展->Microsoft.Office.Interop.Excel
Excel.dll:  http://xiazai.VeVB.COm/201608/yuanma/Excel(VeVB.COm).rar

其他方法:
1.使用NPOI.DLL開源組件,可以不安裝Office軟件,進行讀寫Excel文件。
NPIO.dll:  http://xiazai.VeVB.COm/201608/yuanma/NPOI(VeVB.COm).rar

調用方法如下: 

導出代碼:

/// <summary> /// DataTable導出到Excel的MemoryStream Export() /// </summary> /// <param name="dtSource">DataTable數據源</param> /// <param name="strHeaderText">Excel表頭文本(例如:車輛列表)</param> public static MemoryStream Export(DataTable dtSource, string strHeaderText) { HSSFWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet();  #region 右擊文件 屬性信息 {  DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();  dsi.Company = "NPOI";  workbook.DocumentSummaryInformation = dsi;  SummaryInformation si = 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 ICellStyle dateStyle = workbook.CreateCellStyle(); IDataFormat format = workbook.CreateDataFormat(); dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");  //取得列寬 int[] arrColWidth = new int[dtSource.Columns.Count]; foreach (DataColumn item in dtSource.Columns) {  arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length; } for (int i = 0; i < dtSource.Rows.Count; i++) {  for (int j = 0; j < dtSource.Columns.Count; j++)  {  int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;  if (intTemp > arrColWidth[j])  {   arrColWidth[j] = intTemp;  }  } } int rowIndex = 0; foreach (DataRow row in dtSource.Rows) {  #region 新建表,填充表頭,填充列頭,樣式  if (rowIndex == 65535 || rowIndex == 0)  {  if (rowIndex != 0)  {   sheet = workbook.CreateSheet();  }  #region 表頭及樣式  {   IRow headerRow = sheet.CreateRow(0);   headerRow.HeightInPoints = 25;   headerRow.CreateCell(0).SetCellValue(strHeaderText);   ICellStyle headStyle = workbook.CreateCellStyle();   headStyle.Alignment = HorizontalAlignment.CENTER;    IFont font = workbook.CreateFont();   font.FontHeightInPoints = 20;   font.Boldweight = 700;   headStyle.SetFont(font);   headerRow.GetCell(0).CellStyle = headStyle;   sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));   }  #endregion  #region 列頭及樣式  {   IRow headerRow = sheet.CreateRow(1);   ICellStyle headStyle = workbook.CreateCellStyle();   headStyle.Alignment = HorizontalAlignment.CENTER;    IFont font = workbook.CreateFont();   font.FontHeightInPoints = 10;   font.Boldweight = 700;   headStyle.SetFont(font);   foreach (DataColumn column in dtSource.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 填充內容  IRow dataRow = sheet.CreateRow(rowIndex);  foreach (DataColumn column in dtSource.Columns)  {  ICell newCell = dataRow.CreateCell(column.Ordinal);  string drValue = row[column].ToString();  switch (column.DataType.ToString())  {   case "System.String"://字符串類型   newCell.SetCellValue(drValue);   break;   case "System.DateTime"://日期類型   System.DateTime dateV;   System.DateTime.TryParse(drValue, out dateV);   newCell.SetCellValue(dateV);   newCell.CellStyle = dateStyle;//格式化顯示   break;   case "System.Boolean"://布爾型   bool boolV = false;   bool.TryParse(drValue, out boolV);   newCell.SetCellValue(boolV);   break;   case "System.Int16"://整型   case "System.Int32":   case "System.Int64":   case "System.Byte":   int intV = 0;   int.TryParse(drValue, out intV);   newCell.SetCellValue(intV);   break;   case "System.Decimal"://浮點型   case "System.Double":   double doubV = 0;   double.TryParse(drValue, out doubV);   newCell.SetCellValue(doubV);   break;   case "System.DBNull"://空值處理   newCell.SetCellValue("");   break;   default:   newCell.SetCellValue("");   break;  }  }  #endregion  rowIndex++; } using (MemoryStream ms = new MemoryStream()) {  workbook.Write(ms);  ms.Flush();  ms.Position = 0;  sheet.Dispose();  return ms; } }

導入代碼:

/// <summary> /// 讀取excel ,默認第一行為標頭 /// </summary> /// <param name="strFileName">excel文檔路徑</param> /// <returns></returns> public static DataTable Import(string strFileName) { DataTable dt = new DataTable(); HSSFWorkbook hssfworkbook; using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) {  hssfworkbook = new HSSFWorkbook(file); } ISheet sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) {  ICell cell = headerRow.GetCell(j);  dt.Columns.Add(cell.ToString()); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) {  IRow row = sheet.GetRow(i);  DataRow dataRow = dt.NewRow();  for (int j = row.FirstCellNum; j < cellCount; j++)  {  if (row.GetCell(j) != null)   dataRow[j] = row.GetCell(j).ToString();  }  dt.Rows.Add(dataRow); } return dt; }

2.使用C#發射方式調用Excel進行,不需要引用Excel.dll組件。此種方法不建議,太麻煩,也需要安裝Office。
調用方法如下:

private void Export2Excel(DataGridView datagridview, bool captions) {  object objApp_Late;  object objBook_Late;  object objBooks_Late;  object objSheets_Late;  object objSheet_Late;  object objRange_Late;  object[] Parameters;  string[] headers = new string[datagridview.DisplayedColumnCount(true)];  string[] columns = new string[datagridview.DisplayedColumnCount(true)];  string[] colName = new string[datagridview.DisplayedColumnCount(true)];  int i = 0;  int c = 0;  int m = 0;  for (c = 0; c < datagridview.Columns.Count; c++)  {  for (int j = 0; j < datagridview.Columns.Count; j++)  {   DataGridViewColumn tmpcol = 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  {  // Get the class type and instantiate Excel.  Type objClassType;  objClassType = Type.GetTypeFromProgID("Excel.Application");  objApp_Late = Activator.CreateInstance(objClassType);  //Get the workbooks collection.  objBooks_Late = objApp_Late.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, objApp_Late, null);  //Add a new workbook.  objBook_Late = objBooks_Late.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, objBooks_Late, null);  //Get the worksheets collection.  objSheets_Late = objBook_Late.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, objBook_Late, null);  //Get the first worksheet.  Parameters = new Object[1];  Parameters[0] = 1;  objSheet_Late = objSheets_Late.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, objSheets_Late, Parameters);  if (captions)  {   // Create the headers in the first row of the sheet   for (c = 0; c < datagridview.DisplayedColumnCount(true); c++)   {   //Get a range object that contains cell.   Parameters = new Object[2];   Parameters[0] = columns[c] + "1";   Parameters[1] = Missing.Value;   objRange_Late = objSheet_Late.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, objSheet_Late, Parameters);   //Write Headers in cell.   Parameters = new Object[1];   Parameters[0] = headers[c];   objRange_Late.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, objRange_Late, Parameters);   }  }  // Now add the data from the grid to the sheet starting in row 2  for (i = 0; i < datagridview.RowCount; i++)  {   c = 0;   foreach (string txtCol in colName)   {   DataGridViewColumn col = datagridview.Columns[txtCol];   if (col.Visible)   {    //Get a range object that contains cell.    Parameters = new Object[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);    //Write Headers in cell.    Parameters = new Object[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++;   }   }  }  //Return control of Excel to the user.  Parameters = new Object[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 (Exception theException)  {  String errorMessage;  errorMessage = "Error: ";  errorMessage = String.Concat(errorMessage, theException.Message);  errorMessage = String.Concat(errorMessage, " Line: ");  errorMessage = String.Concat(errorMessage, theException.Source);  MessageBox.Show(errorMessage, "Error");  } }

復制代碼 代碼如下:
System.Type ExcelType = System.Type.GetTypeFromProgID("Excel.Application");
Microsoft.Office.Interop.Excel.Application obj = Activator.CreateInstance(ExcelType) as Microsoft.Office.Interop.Excel.Application;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97久久精品视频| 正在播放亚洲1区| 国产精品第1页| 久久久久久久久久久国产| 亚洲视频在线免费观看| 精品久久香蕉国产线看观看gif| 久久99精品久久久久久噜噜| 在线观看成人黄色| 中文字幕v亚洲ⅴv天堂| 91精品国产99久久久久久| 欧美高清在线观看| 中国日韩欧美久久久久久久久| 日韩一区在线视频| 久久免费视频这里只有精品| 国产精品自在线| 91亚洲午夜在线| 日韩欧美中文第一页| 国产综合香蕉五月婷在线| 久久韩国免费视频| 亚洲区中文字幕| 日韩成人av在线播放| 久久久精品日本| 亚洲精品一区二区三区不| 国产精品影院在线观看| 久久全球大尺度高清视频| 亚洲精品永久免费精品| 成人精品aaaa网站| 久久精品久久精品亚洲人| 中文字幕亚洲一区在线观看| 久久av中文字幕| 久久天天躁狠狠躁夜夜爽蜜月| 色婷婷成人综合| 亚洲免费视频一区二区| 国产婷婷97碰碰久久人人蜜臀| 久久久久久亚洲精品中文字幕| 日韩在线观看免费全集电视剧网站| 亚洲欧美在线磁力| 日韩精品中文字幕久久臀| 日韩精品中文字幕在线观看| 日韩av观看网址| 懂色aⅴ精品一区二区三区蜜月| 成人免费观看a| 国产一区二区三区在线播放免费观看| 日韩成人激情在线| 久久久久女教师免费一区| 国产精品日韩欧美大师| 欧美激情综合色综合啪啪五月| 国产欧美 在线欧美| 久久亚洲综合国产精品99麻豆精品福利| 91免费精品国偷自产在线| 中文字幕九色91在线| 国模精品一区二区三区色天香| 欧美成人亚洲成人日韩成人| 国产精品一区二区三区毛片淫片| 中文字幕九色91在线| 久久国产精品免费视频| 性欧美长视频免费观看不卡| 欧美裸体视频网站| 欧美日韩综合视频网址| 亚洲国产高清福利视频| 国产精品自拍网| 国产精品免费一区豆花| 欧美第一黄网免费网站| 日韩精品在线观| 国产一区二区三区直播精品电影| 中文字幕精品久久| 欧美丝袜一区二区| 日韩大陆欧美高清视频区| 欧美激情精品久久久久久黑人| 国产欧美日韩综合精品| 亚洲综合av影视| 久久视频在线视频| 成人欧美在线视频| 成人在线视频网| 欧美性猛交xxxx免费看| 亚洲国产成人久久综合| 国内精品模特av私拍在线观看| 97精品国产aⅴ7777| 色小说视频一区| 91亚洲精品久久久久久久久久久久| 日韩精品一区二区三区第95| 国产一区二区丝袜| 国产色婷婷国产综合在线理论片a| 国产精品久久97| 国产精品海角社区在线观看| 97国产精品视频人人做人人爱| 国产在线观看91精品一区| 亚洲aⅴ日韩av电影在线观看| 国产suv精品一区二区| 久久久久久久97| 中文字幕欧美日韩精品| 亚洲аv电影天堂网| 国产精品国产三级国产aⅴ9色| 欧美在线视频导航| 日韩av片免费在线观看| 91精品国产综合久久香蕉的用户体验| 日韩欧美国产激情| 日韩免费在线免费观看| 亚洲精品自产拍| 欧美做受高潮电影o| 久久综合免费视频影院| 2019中文字幕免费视频| 亚洲人成网在线播放| 欧美日韩一区二区三区| 久热99视频在线观看| 91色在线视频| 成人在线免费观看视视频| 91探花福利精品国产自产在线| 亚洲www永久成人夜色| 韩国19禁主播vip福利视频| 国产精品亚洲一区二区三区| 亚洲国产成人精品久久久国产成人一区| 亚洲精品99久久久久中文字幕| 亚洲综合色激情五月| 97免费视频在线| 亚洲一区二区三区毛片| 日韩欧美精品中文字幕| 91产国在线观看动作片喷水| 亚洲国产日韩欧美在线图片| 中文字幕在线亚洲| 日韩有码在线播放| 亚洲精品久久久久久久久久久久| 日韩高清不卡av| 在线播放国产一区中文字幕剧情欧美| 97在线精品国自产拍中文| 亚洲国产日韩欧美在线动漫| 国产精品亚发布| 亚洲精品99999| 国产精品久久久久久中文字| 91精品国产99| 三级精品视频久久久久| 欧美精品www在线观看| 91亚洲精品久久久久久久久久久久| 日韩国产高清视频在线| 久久久999精品视频| 国产91露脸中文字幕在线| 日韩欧美大尺度| 欧美成人激情视频免费观看| 日韩动漫免费观看电视剧高清| 精品国产一区二区三区在线观看| 91免费看片在线| 国产精品一区二区三区毛片淫片| 国产精品美女免费| 69久久夜色精品国产7777| 欧美主播福利视频| 亚洲国产精品va在线看黑人动漫| 久久精品国产69国产精品亚洲| 久久综合国产精品台湾中文娱乐网| 欧美激情在线狂野欧美精品| 国产精品视频一区二区三区四| 亚洲男女自偷自拍图片另类| 精品动漫一区二区三区| 91牛牛免费视频| 国产精品你懂得| 精品福利在线观看| 中日韩美女免费视频网址在线观看| 68精品久久久久久欧美| 亚洲天堂av在线播放| 国产99久久精品一区二区| 国模精品一区二区三区色天香| 亚洲欧美一区二区激情| 欧美激情精品久久久久久久变态| 在线一区二区日韩| 国产精品高清网站|