数据写入Excel文件自动分页,并指定要合并的列索引

来源:互联网 发布:知乎中药学读后感 编辑:程序博客网 时间:2024/05/16 15:16

/// <summary>
  /// 将DataTable数据写入Excel文件(自动分页,并指定要合并的列索引)
  /// </summary>
  /// <param name="dt">DataTable</param>
  /// <param name="rows">每个WorkSheet写入多少行数据</param>
  /// <param name="top">表格数据起始行索引</param>
  /// <param name="left">表格数据起始列索引</param>
  /// <param name="mergeColumnIndex">DataTable中要合并相同行的列索引,从0开始</param>
  public void DataTableToExcel(DataTable dt,int rows,int top,int left,int mergeColumnIndex)
  {
   int rowCount = dt.Rows.Count;  //源DataTable行数
   int colCount = dt.Columns.Count; //源DataTable列数
   sheetCount = this.GetSheetCount(rowCount,rows); //WorkSheet个数
//   StringBuilder sb;
    
   //复制sheetCount-1个WorkSheet对象
   for(int i=1;i<sheetCount;i++)
   {
    workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
    workSheet.Copy(missing,workBook.Worksheets[i]);
   }
  
   for(int i=1;i<=sheetCount;i++)
   {
    int startRow = (i - 1) * rows;  //记录起始行索引
    int endRow = i * rows;   //记录结束行索引
  
    //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数
    if(i == sheetCount)
     endRow = rowCount;
  
    //获取要写入数据的WorkSheet对象,并重命名
    workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
    workSheet.Name = sheetPrefixName + "-" + i.ToString();
  
    //将dt中的数据写入WorkSheet
//    for(int j=0;j<endRow-startRow;j++)
//    {
//     for(int k=0;k<colCount;k++)
//     {
//      workSheet.Cells[top + j,left + k] = dt.Rows[startRow + j][k].ToString();
//     }
//    }

    //利用二维数组批量写入
    int row = endRow-startRow;
    string[,] ss = new string[row,colCount];

    for(int j=0;j<row;j++)
    {
     for(int k=0;k<colCount;k++)
     {
      ss[j,k] = dt.Rows[startRow + j][k].ToString();
     }
    }

    range = (Excel.Range)workSheet.Cells[top,left];
    range = range.get_Resize(row,colCount);
    range.Value = ss;

    //合并相同行
    this.MergeRows(workSheet,left+mergeColumnIndex,top,rows);
      
   }
  }