嗯,项目需要。。。

       正好知道OpenXml这个东西,所以就拿过来研究了一下。

       总体感觉果然是XML思想的产物,我原以为是像DataTable那样操作Excel,结果我想多了,不过还好,挺好用的,扩展性很好的说。


      这个链接是微软MVA学院介绍OpenXml的简单教程

      Open Xml SDK教程


     这个是OpenXml SDK的下载链接

     下载 OpenXml SDK


     解压之后,安装。

     然后在解决方案中添加这两个引用

  

    wKioL1UpComT2opLAAASa39ui6A363.jpg

wKiom1UpCT3TDYBqAAAKGyaNzgw854.jpg


     以下是代码

     (有一点要注意,这个总结是对于向Excel模板中插入数据的,也就是必须保证Excel中有这些Element,对于向一个新的Sheet中插入数据,就必须先创建Element,再填充数据。

      

     首先,你要有个DataTable来填充Excel

     

DataTable dt = new DataTable();

dt.Columns.Add("1");
dt.Columns.Add("2");
dt.Columns.Add("3");
dt.Columns.Add("4");
dt.Columns.Add("5");
dt.Columns.Add("6");
dt.Columns.Add("7");
dt.Columns.Add("8");
dt.Columns.Add("9");
dt.Columns.Add("10");
dt.Columns.Add("11");
dt.Columns.Add("12");

for (int i = 0; i < 3; i++)
{
    DataRow dr = dt.NewRow();

    for (int j = 0; j < 12; j++)
    {
        dr[j] = i + j;
    }

    dt.Rows.Add(dr);
}


       然后,写个方法,传进去

       

 

public string Demo(string file, DataTable dt)
{
 using (SpreadsheetDocument doucument = SpreadsheetDocument.Open(file, true))
 //首先打开一个Excel文档,file指的是Excel的路径,后面的bool参数指的是能否修改,这里因为
 //要对Excel做插入数据处理,所有为ture
 {
 
   IEnumerable s = doucument.WorkbookPart.Workbook.Descendants().Where(x => x.Name == "Sheet1");
   //这里利用一个重要的方法Descendants(),在该元素之下寻找指定子元素
   //也就是在工作簿下寻找指定名称为“Sheet1”的工作页
   //这里返回的是泛型IEnumerable

   WorksheetPart sheet = (WorksheetPart)doucument.WorkbookPart.GetPartById(s.First().Id);
   //我们要从泛型中提取第一个工作页


   int q = 0;//作为行的计数

   foreach (var row in sheet.Worksheet.Descendants())
   //这里,利用Descendants()方法来获取所有的Row
   //OpenXml有一点的好处是,支持LINQ
   //在这里,如果我们从第三行开始插入的话可以这样写
   //var row in sheet.Worksheet.Descendants().Where(c => c.RowIndex >= 3    // && c.RowIndex <= dt.Rows.Count + 3)
   //这样就获得了第三行到第 dt.Rows.Count + 3 行的引用集合
   {
      if (q >= dt.Rows.Count)
         break;
      //限制行的循环不能超过dt的行数

      int d = 0;//作为列的计数

      foreach (Cell cell in row.Descendants())
      //循环所有的列
      {

         if (d >= dt.Columns.Count)
            break;
         //限制列的循环不能超过dt的列数


         cell.CellValue = new CellValue(dt.Rows[q][d].ToString());
         //赋值,就是这么简单。。。。,如果你的需求就是这么简单的话。。。。。

         d++;
       }

      q++;
    }

    sheet.Worksheet.Save();
    //千万别忘了保存,要不然写了等于没写

    }
}


       总的来说,还是要多练习,多尝试。

       不过我第一次搞这个的时候,这些代码花了两三个小时,一边百度一边尝试。

       其实我是想把它封装成类似 

       sheet[RowBeginIndex][ColumnBeginIndex].Update(dt,dt.Row.count,dt.Column.Count);


       以上,以后再慢慢改吧

       头好痛,没睡好...........