导出Excel 报表

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章