让C# Excel导入导出,支持不同版本的Office

来源:互联网 发布:淘宝运营考核 编辑:程序博客网 时间:2024/05/22 10:59

http://www.daxueit.com/article/13657.html

问题:最近在项目中遇到,不同客户机安装不同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.引用Excel14.0.0 DLL组件方法,vs2012 右键添加引用->程序集->扩展->Microsoft.Office.Interop.Excel

  Excel.dll http://files.cnblogs.com/files/ichk/Microsoft.Office.Interop.Excel.rar



导入导出的其他方法:

  1.使用NPOI.DLL开源组件,可以不安装Office软件,进行读写Excel文件。

  NPIO.dll http://files.cnblogs.com/files/ichk/NPOI.rar

调用方法如下:

导出代码:

[csharp] view plain copy
  1. /// <summary>  
  2.  /// DataTable导出到Excel的MemoryStream Export()  
  3.  /// </summary>  
  4.  /// <param name="dtSource">DataTable数据源</param>  
  5.  /// <param name="strHeaderText">Excel表头文本(例如:车辆列表)</param>  
  6.  public static MemoryStream Export(DataTable dtSource, string strHeaderText)  
  7.  {  
  8.      HSSFWorkbook workbook = new HSSFWorkbook();  
  9.      ISheet sheet = workbook.CreateSheet();  
  10.        
  11.      #region 右击文件 属性信息  
  12.      {  
  13.          DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();  
  14.          dsi.Company = "NPOI";  
  15.          workbook.DocumentSummaryInformation = dsi;  
  16.    
  17.          SummaryInformation si = PropertySetFactory.CreateSummaryInformation();  
  18.          si.Author = "文件作者信息"//填加xls文件作者信息  
  19.          si.ApplicationName = "创建程序信息"//填加xls文件创建程序信息  
  20.          si.LastAuthor = "最后保存者信息"//填加xls文件最后保存者信息  
  21.          si.Comments = "作者信息"//填加xls文件作者信息  
  22.          si.Title = "标题信息"//填加xls文件标题信息  
  23.          si.Subject = "主题信息";//填加文件主题信息  
  24.          si.CreateDateTime = System.DateTime.Now;  
  25.          workbook.SummaryInformation = si;  
  26.      }  
  27.      #endregion  
  28.    
  29.      ICellStyle dateStyle = workbook.CreateCellStyle();  
  30.      IDataFormat format = workbook.CreateDataFormat();  
  31.      dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");  
  32.         
  33.      //取得列宽  
  34.      int[] arrColWidth = new int[dtSource.Columns.Count];  
  35.      foreach (DataColumn item in dtSource.Columns)  
  36.      {  
  37.          arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;  
  38.      }  
  39.      for (int i = 0; i < dtSource.Rows.Count; i++)  
  40.      {  
  41.          for (int j = 0; j < dtSource.Columns.Count; j++)  
  42.          {  
  43.              int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;  
  44.              if (intTemp > arrColWidth[j])  
  45.              {  
  46.                  arrColWidth[j] = intTemp;  
  47.              }  
  48.          }  
  49.      }  
  50.      int rowIndex = 0;  
  51.      foreach (DataRow row in dtSource.Rows)  
  52.      {  
  53.          #region 新建表,填充表头,填充列头,样式  
  54.          if (rowIndex == 65535 || rowIndex == 0)  
  55.          {  
  56.              if (rowIndex != 0)  
  57.              {  
  58.                  sheet = workbook.CreateSheet();  
  59.              }  
  60.   
  61.              #region 表头及样式  
  62.              {  
  63.                  IRow headerRow = sheet.CreateRow(0);  
  64.                  headerRow.HeightInPoints = 25;  
  65.                  headerRow.CreateCell(0).SetCellValue(strHeaderText);  
  66.    
  67.                  ICellStyle headStyle = workbook.CreateCellStyle();  
  68.                  headStyle.Alignment = HorizontalAlignment.CENTER;   
  69.                  IFont font = workbook.CreateFont();  
  70.                  font.FontHeightInPoints = 20;  
  71.                  font.Boldweight = 700;  
  72.                  headStyle.SetFont(font);  
  73.                  headerRow.GetCell(0).CellStyle = headStyle;  
  74.                  sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));   
  75.              }  
  76.              #endregion  
  77.   
  78.              #region 列头及样式  
  79.              {  
  80.                  IRow headerRow = sheet.CreateRow(1);  
  81.                  ICellStyle headStyle = workbook.CreateCellStyle();  
  82.                  headStyle.Alignment = HorizontalAlignment.CENTER;   
  83.                  IFont font = workbook.CreateFont();  
  84.                  font.FontHeightInPoints = 10;  
  85.                  font.Boldweight = 700;  
  86.                  headStyle.SetFont(font);  
  87.                  foreach (DataColumn column in dtSource.Columns)  
  88.                  {  
  89.                      headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);  
  90.                      headerRow.GetCell(column.Ordinal).CellStyle = headStyle;  
  91.    
  92.                      //设置列宽  
  93.                      sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);  
  94.                  }  
  95.              }  
  96.              #endregion  
  97.               rowIndex = 2;  
  98.          }  
  99.          #endregion  
  100.   
  101.          #region 填充内容  
  102.          IRow dataRow = sheet.CreateRow(rowIndex);  
  103.          foreach (DataColumn column in dtSource.Columns)  
  104.          {  
  105.              ICell newCell = dataRow.CreateCell(column.Ordinal);  
  106.               string drValue = row[column].ToString();  
  107.               switch (column.DataType.ToString())  
  108.              {  
  109.                  case "System.String"://字符串类型  
  110.                      newCell.SetCellValue(drValue);  
  111.                      break;  
  112.                  case "System.DateTime"://日期类型  
  113.                      System.DateTime dateV;  
  114.                      System.DateTime.TryParse(drValue, out dateV);  
  115.                      newCell.SetCellValue(dateV);  
  116.    
  117.                      newCell.CellStyle = dateStyle;//格式化显示  
  118.                      break;  
  119.                  case "System.Boolean"://布尔型  
  120.                      bool boolV = false;  
  121.                      bool.TryParse(drValue, out boolV);  
  122.                      newCell.SetCellValue(boolV);  
  123.                      break;  
  124.                  case "System.Int16"://整型  
  125.                  case "System.Int32":  
  126.                  case "System.Int64":  
  127.                  case "System.Byte":  
  128.                      int intV = 0;  
  129.                      int.TryParse(drValue, out intV);  
  130.                      newCell.SetCellValue(intV);  
  131.                      break;  
  132.                  case "System.Decimal"://浮点型  
  133.                  case "System.Double":  
  134.                      double doubV = 0;  
  135.                      double.TryParse(drValue, out doubV);  
  136.                      newCell.SetCellValue(doubV);  
  137.                      break;  
  138.                  case "System.DBNull"://空值处理  
  139.                      newCell.SetCellValue("");  
  140.                      break;  
  141.                  default:  
  142.                      newCell.SetCellValue("");  
  143.                      break;  
  144.              }  
  145.          }  
  146.          #endregion  
  147.    
  148.          rowIndex++;  
  149.      }  
  150.      using (MemoryStream ms = new MemoryStream())  
  151.      {  
  152.          workbook.Write(ms);  
  153.          ms.Flush();  
  154.          ms.Position = 0;  
  155.          sheet.Dispose();  
  156.          return ms;  
  157.      }  
  158.  }  
导入代码:

[csharp] view plain copy
  1. /// <summary>  
  2. /// 读取excel ,默认第一行为标头  
  3. /// </summary>  
  4. /// <param name="strFileName">excel文档路径</param>  
  5. /// <returns></returns>  
  6. public static DataTable Import(string strFileName)  
  7. {  
  8.     DataTable dt = new DataTable();  
  9.    
  10.     HSSFWorkbook hssfworkbook;  
  11.     using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))  
  12.     {  
  13.         hssfworkbook = new HSSFWorkbook(file);  
  14.     }  
  15.     ISheet sheet = hssfworkbook.GetSheetAt(0);  
  16.     System.Collections.IEnumerator rows = sheet.GetRowEnumerator();  
  17.    
  18.     IRow headerRow = sheet.GetRow(0);  
  19.     int cellCount = headerRow.LastCellNum;  
  20.    
  21.     for (int j = 0; j < cellCount; j++)  
  22.     {  
  23.         ICell cell = headerRow.GetCell(j);  
  24.         dt.Columns.Add(cell.ToString());  
  25.     }  
  26.    
  27.     for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)  
  28.     {  
  29.         IRow row = sheet.GetRow(i);  
  30.         DataRow dataRow = dt.NewRow();  
  31.    
  32.         for (int j = row.FirstCellNum; j < cellCount; j++)  
  33.         {  
  34.             if (row.GetCell(j) != null)  
  35.                 dataRow[j] = row.GetCell(j).ToString();  
  36.         }  
  37.    
  38.         dt.Rows.Add(dataRow);  
  39.     }  
  40.     return dt;  
  41. }  



2.使用C#发射方式调用Excel进行,不需要引用Excel.dll组件。此种方法不建议,太麻烦,也需要安装Office。

调用方法如下:

[csharp] view plain copy
  1. private void Export2Excel(DataGridView datagridview, bool captions)  
  2.      {  
  3.          object objApp_Late;  
  4.          object objBook_Late;  
  5.          object objBooks_Late;  
  6.          object objSheets_Late;  
  7.          object objSheet_Late;  
  8.          object objRange_Late;  
  9.          object[] Parameters;  
  10.   
  11.          string[] headers = new string[datagridview.DisplayedColumnCount(true)];  
  12.          string[] columns = new string[datagridview.DisplayedColumnCount(true)];  
  13.          string[] colName = new string[datagridview.DisplayedColumnCount(true)];  
  14.   
  15.          int i = 0;  
  16.          int c = 0;  
  17.          int m = 0;  
  18.   
  19.          for (c = 0; c < datagridview.Columns.Count; c++)  
  20.          {  
  21.              for (int j = 0; j < datagridview.Columns.Count; j++)  
  22.              {  
  23.                  DataGridViewColumn tmpcol = datagridview.Columns[j];  
  24.                  if (tmpcol.DisplayIndex == c)  
  25.                  {  
  26.                      if (tmpcol.Visible) //不显示的隐藏列初始化为tag=0  
  27.                      {  
  28.                          headers[c - m] = tmpcol.HeaderText;  
  29.                          i = c - m + 65;  
  30.                          columns[c - m] = Convert.ToString((char)i);  
  31.                          colName[c - m] = tmpcol.Name;  
  32.                      }  
  33.                      else  
  34.                      {  
  35.                          m++;  
  36.                      }  
  37.                      break;  
  38.                  }  
  39.              }  
  40.          }  
  41.   
  42.          try  
  43.          {  
  44.              // Get the class type and instantiate Excel.  
  45.              Type objClassType;  
  46.              objClassType = Type.GetTypeFromProgID("Excel.Application");  
  47.              objApp_Late = Activator.CreateInstance(objClassType);  
  48.              //Get the workbooks collection.  
  49.              objBooks_Late = objApp_Late.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, objApp_Late, null);  
  50.              //Add a new workbook.  
  51.              objBook_Late = objBooks_Late.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, objBooks_Late, null);  
  52.              //Get the worksheets collection.  
  53.              objSheets_Late = objBook_Late.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, objBook_Late, null);  
  54.              //Get the first worksheet.  
  55.              Parameters = new Object[1];  
  56.              Parameters[0] = 1;  
  57.              objSheet_Late = objSheets_Late.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, objSheets_Late, Parameters);  
  58.   
  59.              if (captions)  
  60.              {  
  61.                  // Create the headers in the first row of the sheet  
  62.                  for (c = 0; c < datagridview.DisplayedColumnCount(true); c++)  
  63.                  {  
  64.                      //Get a range object that contains cell.  
  65.                      Parameters = new Object[2];  
  66.                      Parameters[0] = columns[c] + "1";  
  67.                      Parameters[1] = Missing.Value;  
  68.                      objRange_Late = objSheet_Late.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, objSheet_Late, Parameters);  
  69.                      //Write Headers in cell.  
  70.                      Parameters = new Object[1];  
  71.                      Parameters[0] = headers[c];  
  72.                      objRange_Late.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, objRange_Late, Parameters);  
  73.                  }  
  74.              }  
  75.   
  76.              // Now add the data from the grid to the sheet starting in row 2  
  77.              for (i = 0; i < datagridview.RowCount; i++)  
  78.              {  
  79.                  c = 0;  
  80.                  foreach (string txtCol in colName)  
  81.                  {  
  82.                      DataGridViewColumn col = datagridview.Columns[txtCol];  
  83.                      if (col.Visible)  
  84.                      {  
  85.                          //Get a range object that contains cell.  
  86.                          Parameters = new Object[2];  
  87.                          Parameters[0] = columns[c] + Convert.ToString(i + 2);  
  88.                          Parameters[1] = Missing.Value;  
  89.                          objRange_Late = objSheet_Late.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, objSheet_Late, Parameters);  
  90.                          //Write Headers in cell.  
  91.                          Parameters = new Object[1];  
  92.                          //Parameters[0] = datagridview.Rows[i].Cells[headers[c]].Value.ToString();  
  93.                          Parameters[0] = datagridview.Rows[i].Cells[col.Name].Value.ToString();  
  94.                          objRange_Late.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, objRange_Late, Parameters);  
  95.                          c++;  
  96.                      }  
  97.   
  98.                  }  
  99.              }  
  100.   
  101.              //Return control of Excel to the user.  
  102.              Parameters = new Object[1];  
  103.              Parameters[0] = true;  
  104.              objApp_Late.GetType().InvokeMember("Visible", BindingFlags.SetProperty,  
  105.              null, objApp_Late, Parameters);  
  106.              objApp_Late.GetType().InvokeMember("UserControl", BindingFlags.SetProperty,  
  107.              null, objApp_Late, Parameters);  
  108.          }  
  109.          catch (Exception theException)  
  110.          {  
  111.              String errorMessage;  
  112.              errorMessage = "Error: ";  
  113.              errorMessage = String.Concat(errorMessage, theException.Message);  
  114.              errorMessage = String.Concat(errorMessage, " Line: ");  
  115.              errorMessage = String.Concat(errorMessage, theException.Source);  
  116.   
  117.              MessageBox.Show(errorMessage, "Error");  
  118.          }  
  119.      }  

导出

[csharp] view plain copy
  1. System.Type ExcelType = System.Type.GetTypeFromProgID("Excel.Application");  
  2. Microsoft.Office.Interop.Excel.Application obj = Activator.CreateInstance(ExcelType) as Microsoft.Office.Interop.Excel.Application;