/// <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