導出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

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