/// <summary>
/// 綁定數據源
/// </summary>
private static Hashtable datasouceHastable;
/// <summary>
/// 文檔版本 2003 2007
/// </summary>
private static ExcelReportVersion excelReportVersion;
/// <summary>
/// 沒個數據源對應的 顯示列名
/// </summary>
private static Hashtable ColumnsdataTable;
/// <summary>
/// Initializes a new instance of the <see cref="CreaExcelReportByDataTable"/> class.
/// dataTableHashtable 多個數據源 dataTableColumns需要顯示的列名 存放在為一維數組中 excelPathfileName 文件保存全路徑
/// </summary>
/// <param name="dataTableHashtable">The data table hashtable.</param>
/// <param name="dataTableArrayColumns">The data table array columns.</param>
/// <param name="enumExcelReportVersion">The enum excel report version.</param>
public CreaExcelReportByDataTable(Hashtable dataTableHashtable, Hashtable dataTableArrayColumns, ExcelReportVersion enumExcelReportVersion)
{
datasouceHastable = dataTableHashtable;
ColumnsdataTable = dataTableArrayColumns;
excelReportVersion = enumExcelReportVersion;
}
/// <summary>
/// Creates the report by source.
/// </summary>
private void CreateReportBySource()
{
System.Data.DataTable dt;
int rowLenth = 0;//行數
int columnLenth = 0;//列數
int sheetRowCount = 0;//分sheet數
int nMaxRowcount = ROWCOUNT;//sheet最大行數 默認 excel 2003 最大行數 65535
if (object.Equals(excelReportVersion, ExcelReportVersion.Excel2007))
{
nMaxRowcount = XLSXROWCOUNT; //excel 2007 最大行數
}
//每條數據源 對應一個sheet 且根據數據條數 分多sheet
foreach (DictionaryEntry datatable in datasouceHastable)//每個數據源配置
{
dt = (System.Data.DataTable)datatable.Value;
//存放列名的數組
string[,] columnNames = new string[1, 1];
//存儲多個Sheet的內容,內容為二維數組
Hashtable rangeValuesCollection = new Hashtable();
rowLenth = dt.Rows.Count;
columnLenth = dt.Columns.Count;
sheetRowCount = Convert.ToInt32(Math.Ceiling((double)rowLenth / (double)(nMaxRowcount - 1)));//根據行計算獲得Sheet數量,每個Sheet增加一行(列名行)
#region 設置列名 組
//是否存在該主鍵的值
if (!object.Equals(ColumnsdataTable,null) && ColumnsdataTable.ContainsKey(datatable.Key))
{
//列名數組
string[] columnNameGroup = (string[])ColumnsdataTable[datatable.Key];
columnNames = new string[1, columnNameGroup.Length];
for (int n = 0; n < columnNameGroup.Length; n++)
{
columnNames[0, n] = columnNameGroup[0];
}
}
else//未指定列名 需要預留一行顯示列名
{
columnNames = new string[1, columnLenth];
for (int n = 0; n < columnLenth; n++)
{
columnNames[0, n] = dt.Columns[n].ColumnName;
}
}
#endregion
string[,] rangeValues = new string[1, 1];
if (sheetRowCount > 1)//多sheet
{
for (int i = 0; i < sheetRowCount; i++)
{
//判斷當前 I 是否是最後一個sheet
if (i == (sheetRowCount - 1))
{
//得到最後一個sheet 應該的行數
rowLenth = ROWCOUNT - ((sheetRowCount * (ROWCOUNT - 1)) - rowLenth) - 1;
rangeValues = new string[rowLenth, columnLenth];
//區域賦值
SetRangeValue(ref rangeValues, i * (ROWCOUNT - 1), rowLenth, columnLenth, dt);
}
else
{
rangeValues = new string[ROWCOUNT - 1, columnLenth];
//區域賦值
SetRangeValue(ref rangeValues, i * (ROWCOUNT - 1), ROWCOUNT - 1, columnLenth, dt);
}
rangeValuesCollection.Add(i, rangeValues);
}
}
else
{
rangeValues = new string[rowLenth, columnLenth];//內容數據數組
for (int j = 0; j < rowLenth; j++)
{
for (int i = 0; i < columnLenth; i++)
{
rangeValues[j, i] = dt.Rows[j][i].ToString().Trim();
}
}
rangeValuesCollection.Add(0, rangeValues);
}
for (int m = 0; m < sheetRowCount; m++)//創建多個Sheet
{
int row = nMaxRowcount;
//判斷當前I 是否是最後一個sheet
if (m == (sheetRowCount - 1))
{
//最後一個sheet的 行數
row = rowLenth + 1;
}
m_WorkSheet = m_Excel.CreateSheet(ref m_Application, ref m_Sheets, datatable.Key+ "-" + (m + 1).ToString());
m_Excel.DeleteSheetByName(ref m_Application, ref m_Sheets, "Sheet1");
Range excelColumnRange = m_ExcelRange.GetRange(m_WorkSheet, 1, 1, 1, columnLenth);
// 設置區域樣式
SetRangeStyle(excelColumnRange, m_ExcelRange);
excelColumnRange.Value2 = columnNames;
excelColumnRange.EntireColumn.AutoFit();//自動調整列寬
Range excelRange = m_ExcelRange.GetRange(m_WorkSheet, 2, 1, row, columnLenth);
excelRange.Value2 = (string[,])rangeValuesCollection[m];
excelRange.EntireColumn.AutoFit();//自動調整列寬
excelRange.HorizontalAlignment = XlHAlign.xlHAlignCenter;
excelColumnRange.VerticalAlignment = XlVAlign.xlVAlignCenter;
}
}
}
/// <summary>
/// Set Range Value.
/// </summary>
/// <param name="rangeValues">ref 二維數組</param>
/// <param name="startRowIndex">開始行</param>
/// <param name="rowLenth">中行數</param>
/// <param name="columnLenth">中列數</param>
/// <param name="dt">System.Data.DataTable</param>
private void SetRangeValue(ref string[,] rangeValues, int startRowIndex, int rowLenth, int columnLenth, System.Data.DataTable dt)
{
//startRowIndex 從dt中第 startRowIndex 條 記錄開始賦值
for (int j = 0; j < rowLenth; j++)
{
for (int i = 0; i < columnLenth; i++)
{
rangeValues[j, i] = dt.Rows[startRowIndex][i].ToString().Trim();
}
startRowIndex = startRowIndex + 1;
}
}
#region Sets the range style 設置區域樣式
/// <summary>
/// Sets the range style.
/// </summary>
/// <param name="excelColumnRange">The excel column range.</param>
/// <param name="m_ExcelRange">The m_ excel range.</param>
private void SetRangeStyle(Range excelColumnRange, ExcelRangeUtility m_ExcelRange)
{
excelColumnRange.Font.Bold = true;
excelColumnRange.Font.ColorIndex = ColorIndex.Black;
excelColumnRange.VerticalAlignment = true;
excelColumnRange.Interior.ColorIndex = ColorIndex.SkyBlue;
excelColumnRange.VerticalAlignment = XlVAlign.xlVAlignCenter;
excelColumnRange.HorizontalAlignment = XlHAlign.xlHAlignCenter;
m_ExcelRange.SetRangeBorderWeight(ref excelColumnRange, BorderWeight.gruff);
m_ExcelRange.SetRangeBoderLineStyle(excelColumnRange, XlLineStyle.xlContinuous);
}
#endregion