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

问题:最近在项目中遇到,不同客户机安装不同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.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的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;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#导出GridView数据到Excel文件类实例

    本文实例讲述了C#导出GridView数据到Excel文件类.分享给大家供大家参考.具体如下: 这段C#代码自定义了一个封装类,用于将GridView数据导出到Excel文件 using System; using System.Web; using System.Web.UI; using System.IO; using System.Web.UI.WebControls; namespace DotNet.Utilities { public class ExportExcel { pro

  • C#数据导入/导出Excel文件及winForm导出Execl总结

    一.asp.net中导出Execl的方法: 在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器.在Response输出时,\t分隔的数据,导出execl时,等价于分列,\n等价于换行. 1.将整个html全部输出execl 此法将html中所有的内容,如按钮,表格,图片等全部输出到Execl中. 复制代码 代码如下: Response.Clear(); Response.Buffer= t

  • C#的Excel导入、导出

    本篇主要介绍C#的Excel导入.导出,供大家参考,具体内容如下 一. 介绍 1.1 第三方类库:NPOI 说明:NPOI是POI项目的.NET 版本,可用于Excel.Word的读写操作. 优点:不用装Office环境. 下载地址:http://npoi.codeplex.com/releases 1.2 Excel结构介绍 工作簿(Workbook):每个Excel文件可理解为一个工作簿. 工作表(Sheet):一个工作簿(Workbook)可以包含多个工作表. 行(row):一个工作表(S

  • c# 将Datatable数据导出到Excel表格中

    话不多说,请看代码: public FileResult GetExcelFile() { if (Session["beginDate"] != null) { string bdate = Session["beginDate"].ToString(); DateTime ld = Convert.ToDateTime(Session["lastDate"].ToString()); DateTime ldate = ld.AddDays(1

  • C#导入导出EXCEL文件的代码实例

    复制代码 代码如下: using System;using System.Data;using System.Data.OleDb; namespace ZFSoft.Joint{    public class ExcelIO    {        private int _ReturnStatus;        private string _ReturnMessage; /// <summary>        /// 执行返回状态        /// </summary&g

  • C#自定义导出数据到Excel的类实例

    本文实例讲述了C#自定义导出数据到Excel的类.分享给大家供大家参考.具体如下: C#自定义Excel操作类,可以用于将DataTable导出到Excel文件,从Excel文件读取数据. using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; using System.Web; using System.Web.UI; using System.We

  • C#使用RenderControl将GridView控件导出到EXCEL的方法

    本文实例展示了C#使用RenderControl将GridView控件导出到EXCEL的方法,是非常实用的一个功能,分享给大家供大家参考.具体如下: 主要功能代码如下: // 把GridView输出到Excel文件 private void ExportExcel(GridView gridView, string title, string title2, string fileName) { int nHideCols = 0; //如果不想输出出某列,将Visible设为false即可 f

  • C#导出数据到Excel文件的方法

    本文实例讲述了C#导出数据到Excel文件的方法.分享给大家供大家参考.具体实现方法如下: /// <summary> /// 导出到Excel类,项目需引用Microsodt.Office.Interop.Excel, /// 类文件需using System.Data与System.Windows.Forms命名空间 /// </summary> public class CToExcel { /// <summary> /// 导出到Excel /// </

  • C#如何将DataTable导出到Excel解决方案

    最近,由于公司项目中需要将系统内用户操作的所有日志进行转存备份,考虑到以后可能还需要还原,所以最后决定将日志数据备份到Excel中. 下面是我项目当中Excel.cs这个类的全部代码,通过这个类可以很容易地将DataTable中的数据导入到Excel方法中. 首先,必须要下载NPOI.dll这个程序集, 类代码如下: 复制代码 代码如下: using System; using NPOI.HSSF; using NPOI.HPSF; using NPOI.HSSF.UserModel; usin

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

    问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误. 找不到Excel Com组件,错误信息如下.  未能加载文件或程序集"Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"或它的某一个依赖项.系统找不到指定的文件. 解决方法: 1.引用高版本的的Excel.dll组件,最新版本14.0.0 防止客户安

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

    问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误.找不到Excel Com组件,错误信息如下. 未能加载文件或程序集“Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项.系统找不到指定的文件. 解决方法: 1.引用高版本的的Excel.dll组件,最新版本14.0.0 防止客户安装高版本如Of

  • Java实现Excel导入导出操作详解

    目录 前言 1. 功能测试 1.1 测试准备 1.2 数据导入 1.2.1 导入解析为JSON 1.2.2 导入解析为对象(基础) 1.2.3 导入解析为对象(字段自动映射) 1.2.4 导入解析为对象(获取行号) 1.2.5 导入解析为对象(获取原始数据) 1.2.6 导入解析为对象(获取错误提示) 1.2.7 导入解析为对象(限制字段长度) 1.2.8 导入解析为对象(必填字段验证) 1.2.9 导入解析为对象(数据唯一性验证) 1.3 数据导出 1.3.1 动态导出(基础) 1.3.2 动

  • C#使用NPOI实现Excel导入导出功能

    本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下 Excel导入 使用OpenFileDiolog控件和button结合,选择文件导入,将路径显示在文本框 设置按钮点击事件,将文件路径赋给textBox.Text private void Department_SUM_Click(object sender, EventArgs e)         {             OpenFileDialog open = new OpenFileDi

  • 使用纯前端JavaScript实现Excel导入导出方法过程详解

    公司最近要为某国企做一个**统计和管理系统, 具体要求包含 Excel导入导出根据导入的数据进行展示报表图表展示(包括柱状图,折线图,饼图),而且还要求要有动画效果,扁平化风格Excel导出,并要提供客户端来管理Excel 文件... 要求真多! 现在总算是完成了,于是将我的经验分析出来. 在整个项目架构中,首先就要解决Excel导入的问题. 由于公司没有自己的框架做Excel IO,就只有通过其他渠道了. 嗯,我在github上找到了一个开源库xlsx,通过npm方式来安装. npm inst

  • SpringBoot集成POI实现Excel导入导出的示例详解

    目录 知识准备 什么是POI POI中基础概念 实现案例 Pom依赖 导出Excel 导入Excel 示例源码 知识准备 需要了解POI工具,以及POI对Excel中的对象的封装对应关系. 什么是POI Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”. A

  • Java实现Excel导入导出数据库的方法示例

    本文实例讲述了Java实现Excel导入导出数据库的方法.分享给大家供大家参考,具体如下: 由于公司需求,想通过Excel导入数据添加到数据库中,而导入的Excel的字段是不固定的,使用得通过动态创建数据表,每个Excel对应一张数据表,怎么动态创建数据表,可以参考前面一篇<java使用JDBC动态创建数据表及SQL预处理的方法>. 下面主要讲讲怎么将Excel导入到数据库中,直接上代码:干货走起~~ ExcellToObjectUtil 类 主要功能是讲Excel中的数据导入到数据库中,有几

  • 简单的excel导入导出示例分享

    复制代码 代码如下: /// <summary>        /// 导出Excel        /// </summary>        /// <param name="stime"></param>        /// <param name="etime"></param>        /// <returns></returns>        pub

  • java实现Excel的导入导出

    本文实例为大家分享了java实现Excel导入导出的具体代码,供大家参考,具体内容如下 一.Excel读写技术 区别: 二.jxl读写基础代码 1.从数据库将数据导出到excel表格 public class JxlExcel { public static void main(String[] args) { //创建Excel文件 String[] title= {"姓名","课程名","分数"}; File file=new File(&q

  • Spring Boot项目如何优雅实现Excel导入与导出功能

    目录 背景 EasyExcel 问题 分析与解决 Spring Boot Excel 导入与导出 依赖引入 Excel 导入 基本导入功能 进阶导入功能 Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则 ExcelValidator 接口定义校验规则 校验结果接收 异常捕获接收校验结果 controller 方法参数接收校验结果 总结 背景 Excel 导入与导出是项目中经常用到的功能,在 Java 中常用 poi 实现 Excel

随机推荐