C#对Excel文件的操作

转帖|其它|编辑:郝浩|2008-08-06 11:49:23.000|阅读 4291 次

概述:C#对Excel文件的操作

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

这里涉及到几个问题,首先,在excel转成DataTable时,如果Excel的列中每一行的数据类型不一样,转成DataTable数据会丢失,解决方法就是先将excel文件转成csv文件,但是这个是由程序来完成的,不是手动完成。如下代码:

/// <summary>
/// 将excel文件另存csv文件
/// </summary>
/// <param name="excelFileName">Excel文件路径</param>
/// <param name="csvFileName">csv文件路径</param>
public static void SaveAsExcel(string excelFileName,string csvFileName)
{
  //定义一个COM中空类型的对象(作用类似于大家所熟悉的null)
  object missing = System.Reflection.Missing.Value;

  //创建Excel应用程序对象(会帮我们在启动Excel进程)
  Excel.Application app = new Excel.ApplicationClass();

  Workbook wb = app.Application.Workbooks.Open(excelFileName,missing,missing,missing,missing,missing,missing,missing,
missing,missing,missing,missing,missing,missing,missing);
  //不出现提示,用默认的选择
  app.Application.DisplayAlerts = false;
  //不运行excel界面
  app.Application.Visible = false;

  Excel.Worksheet sheet = (Excel.Worksheet)wb.ActiveSheet;
  try
  {
    //另存为csv格工,注意Excel.XlFileFormat.xlCSV参数,要另存为别的格式,也是在这里设置
    sheet.SaveAs(csvFileName, Excel.XlFileFormat.xlCSV, missing, missing, false, false, false, missing, missing, false);
  }
  finally
  {

    wb.Close(false, missing, missing);

    app.Quit();
  }
}
当然前提条件是你要加入Mircosoft.Excel.core 11 COM组件(添加引用).

接下来,将VCS写入DataTable,这里用流写入。

/// <summary>
/// 将csv文件中的数据转成dataTabel
/// </summary>
/// <param name="path">csv路径</param>
/// <returns>DataTable</returns>
public DataTable CSVToDS(string path)
{
  String line;
  String[] split = null;
  DataTable table = new DataTable("auto");
  DataRow row = null;
  StreamReader sr = new StreamReader(path,Encoding.Default);

  //创建与数据源对应的数据列
  line = sr.ReadLine();
  split = line.Split(',');
  foreach (String colname in split)
  {
    table.Columns.Add(colname, System.Type.GetType("System.String"));
  }
  //将数据填入数据表
  int j = 0;
  while ((line = sr.ReadLine()) != null)
  {
    j = 0;
    row = table.NewRow();
    split = line.Split(',');
    foreach (String colname in split)
    {
      row[j] = colname;
      j++;
    }
    table.Rows.Add(row);
  }
  sr.Close();
  //显示数据
  return table;
}
由于csv保存内容是以逗号分隔,所以在这里也要用逗号分隔。

第二个问题,创建Excel文件不符合标准。如果用File.Create()方法创建的Excel,用oleDBConnetion创建连接时,将无法创建连接,所以不能以此方法创建Excel文件。用如下方法:

/// <summary>
/// 创建excel文件
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="headerList">excel文件头</param>
public static void CreateFile(string fileName,List<string> headerList)
{
  if (!File.Exists(fileName))
  {
    //定义一个COM中空类型的对象(作用类似于大家所熟悉的null)
    object missing = System.Reflection.Missing.Value;

    //创建Excel应用程序对象(会帮我们在启动Excel进程)
    Excel.Application app = new Excel.ApplicationClass();

    //在Excel中新建一个工作簿
    app.Application.Workbooks.Add(true);

    //取得当前的工作簿(刚才新建的那个)
    Excel.Workbook books = (Excel.Workbook)app.ActiveWorkbook;

    //从当前的工作簿中取得当前活动的工作表
    Excel.Worksheet sheets = (Excel.Worksheet)books.ActiveSheet;

    //通过行和列直接写入数据到指定单元格(第2行第2列,即"B2")
    for (int i = 0; i < headerList.Count; i++)
    {
      sheets.Cells[1, i + 1] = headerList[i];
    }

    //保存文件
    books.SaveCopyAs(fileName);

    //关闭文件
    books.Close(false, missing, missing);

    //退出Excel
    app.Quit();
  }
}

这里的fileName是你要创建Excel文件的绝对路径,headerList是要预存的Excel文件标题.


第三个问题,是将DataTable中的数据写入excel,如果DataTable中的数据有单引号或有其它特殊符号,在插入Excel时,极易出错,解决方法是用参数来代替DataTable中的数据。

先用ole创建一个excel连接
/// <summary>
/// 获取Excel连接
/// </summary>
/// <returns>conn</returns>
public static OleDbConnection GetExcelConnection(string path)
{
  string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + path + ";" + "Extended Properties=Excel 8.0;";
  OleDbConnection conn = new OleDbConnection(connString);
  return conn;
}
其中参数path 为Excel的绝对路径。

然后再将DataTable中的数据写入excel,方法如下:
/// <summary>
/// 将数据写到excel
/// </summary>
/// <param name="fileName">excel路径</param>
/// <param name="table">有数据的DataTable</param>
public void WriteDataToExcel(string fileName, DataTable table)
{

  OleDbConnection excelConn = ConnectionManager.GetExcelConnection(fileName);
  try
  {
    excelConn.Open();
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = excelConn;
    for (int i=0;i<table.Rows.Count;i++)
    {
      OleDbParameter[] param = new OleDbParameter[table.Columns.Count];
      string sql = "insert into [sheet1$] values (";
      for (int j = 0; j < table.Columns.Count; j++)
      {
        string para = "@param" + j;
        if (j == table.Columns.Count - 1)
        {
          sql = sql + para;
        }
        else
        {
          sql = sql + para + ",";
        }
        string value = table.Rows[i][j].ToString();
        param[j] = new OleDbParameter(para, value);
        cmd.Parameters.Add(param[j]);
      }
      sql = sql + ")";
      cmd.CommandText = sql;
      cmd.ExecuteNonQuery();
      cmd.Parameters.Clear();
    }
  }
  catch
  {
    throw;
  }
  finally
  {
    ConnectionManager.Close(excelConn);
  }
}


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:个人博客

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP