NPOI實現兩級分組合併功能

来源:http://www.cnblogs.com/zyxlsh/archive/2017/12/07/8000166.html
-Advertisement-
Play Games

NPOI版本:2.2.1.0 最近公司有這樣的需求: 統計每個部門下麵,多個費用使用情況。部門存在多級,但統計時,只需統計到2級,2級以下的,歸到第2級的部門下。並且要求,第2級部門有個小計,第1級部門需要有個合計。最後,還需提供總計。 本來對NPOI研究的還不夠深入的,以前都是直接通過別人提供的代 ...


  NPOI版本:2.2.1.0

  最近公司有這樣的需求:

  統計每個部門下麵,多個費用使用情況。部門存在多級,但統計時,只需統計到2級,2級以下的,歸到第2級的部門下。並且要求,第2級部門有個小計,第1級部門需要有個合計。最後,還需提供總計。

  本來對NPOI研究的還不夠深入的,以前都是直接通過別人提供的代碼來實現對DataTable中的數據進行全部導出,但裡面不帶合併,及合計功能,不滿足當前需求。不得已,只有好好地研究一下了。還好,最終實現了要求。

  在此,也感謝其他提供相關資料的人員,讓我實現了此功能。

 

  簡要說明一下使用:

  1、Export2Template2方法直接使用。DataTable原始數據,必須是已經按要求排好序的數據。全部是逐行向下處理。

  2、要導出的列名,取自cellKeys中。列名必須為source中存在的。

  3、相同值合併的第1列,為cellKeys[0],合併的第2列,為cellKeys[1],如需要其它列的合併,可以此基礎上,按自己的需求進行調整。(合併時,只會比較上下行的數據內容)

  4、要導出的數據中,數值類型,自動居右。其它類型,自動居中。

  5、小計,合計,總計的字體,全部加黑

  6、小計,合計,總計,自動對數值類型進行彙總。其它類型數據全部置空。

  7、合併的列數:mergeColumns。如果>2,自動只處理前2列。如果<1,則不做合併處理。

 

  直接上可用的代碼:

        /// <summary>
        /// 根據模版導出Excel -- 特別處理,每個分組帶合計
        /// </summary>
        /// <param name="source">源DataTable</param>
        /// <param name="cellKeys">需要導出的對應的列欄位  例:string[] cellKeys = { "Date","Remarks" };</param>
        /// <param name="strFileName">要保存的文件名稱(包含尾碼)  例:"要保存的文件名.xls"</param>
        /// <param name="templateFile">模版文件名(包含路徑尾碼)  例:"模板文件名.xls"</param>
        /// <param name="rowIndex">從第幾行開始創建數據行,第一行為0</param>
        /// <param name="mergeColumns">值相同時,可合併的前幾列 最多支持2列 1=只合併第一列,2=判斷前2列</param>
        /// <param name="isConver">是否覆蓋數據,=false,將把原數據下移。=true,將覆蓋插入行後面的數據</param>
        /// <param name="isTotal">是否帶小計/合計項</param>
        /// <param name="addAllTotal">是否添加總計項</param>
        /// <returns>是否導出成功</returns>
        public static bool Export2Template2(DataTable source, string[] cellKeys, string strFileName, string templateFile, int rowIndex, int mergeColumns, bool isConver, bool isTotal, bool addAllTotal)
        {
            bool bn = false;
            int cellCount = cellKeys.Length; //總列數,第一列為0
            // IWorkbook workbook = null;
            HSSFWorkbook workbook = null;
            string temp0 = "", temp1 = "";
            int start0 = 0, start1 = 0;  // 記錄1,2列值相同的開始序號
            int end0 = 0, end1 = 0;// 記錄1,2列值相同的結束序號

            try
            {
                using (FileStream file = new FileStream(templateFile, FileMode.Open, FileAccess.Read))
                {
                    workbook = new HSSFWorkbook(file);
                }

                #region 定義四類數據的單元格樣式
                // 內容數據格式 -- 數值
                ICellStyle styleNum = workbook.CreateCellStyle();
                styleNum.BorderBottom = BorderStyle.Thin;
                styleNum.BorderLeft = BorderStyle.Thin;
                styleNum.BorderRight = BorderStyle.Thin;
                styleNum.BorderTop = BorderStyle.Thin;
                // styleNum.VerticalAlignment = VerticalAlignment.Center;
                // styleNum.Alignment = HorizontalAlignment.Center;

                // 內容數據格式 -- 字元串(做居中處理)
                ICellStyle styleStr = workbook.CreateCellStyle();
                styleStr.BorderBottom = BorderStyle.Thin;
                styleStr.BorderLeft = BorderStyle.Thin;
                styleStr.BorderRight = BorderStyle.Thin;
                styleStr.BorderTop = BorderStyle.Thin;
                styleStr.VerticalAlignment = VerticalAlignment.Center;
                styleStr.Alignment = HorizontalAlignment.Center;

                // 彙總數據格式 -- 數值
                ICellStyle styleTotalNum = workbook.CreateCellStyle();
                styleTotalNum.BorderBottom = BorderStyle.Thin;
                styleTotalNum.BorderLeft = BorderStyle.Thin;
                styleTotalNum.BorderRight = BorderStyle.Thin;
                styleTotalNum.BorderTop = BorderStyle.Thin;
                styleTotalNum.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
                styleTotalNum.FillPattern = FillPattern.SolidForeground;
                styleTotalNum.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
                // 設置字體顏色
                HSSFFont ffont0 = (HSSFFont)workbook.CreateFont();
                // ffont0.FontHeight = 14 * 14;
                // ffont0.FontName = "宋體";
                ffont0.IsBold = true;
                //ffont0.Color = HSSFColor.Red.Index;
                styleTotalNum.SetFont(ffont0);

                // 彙總數據格式 -- 字元串(做居中處理)
                ICellStyle styleTotalStr = workbook.CreateCellStyle();
                styleTotalStr.BorderBottom = BorderStyle.Thin;
                styleTotalStr.BorderLeft = BorderStyle.Thin;
                styleTotalStr.BorderRight = BorderStyle.Thin;
                styleTotalStr.BorderTop = BorderStyle.Thin;
                styleTotalStr.VerticalAlignment = VerticalAlignment.Center;
                styleTotalStr.Alignment = HorizontalAlignment.Center;
                styleTotalStr.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
                styleTotalStr.FillPattern = FillPattern.SolidForeground;
                // 設置字體顏色
                HSSFFont ffont1 = (HSSFFont)workbook.CreateFont();
                // ffont1.FontHeight = 14 * 14;
                // ffont1.FontName = "宋體";
                ffont1.IsBold = true;
                //ffont.Color = HSSFColor.Red.Index;
                styleTotalStr.SetFont(ffont1);
                #endregion

                ISheet sheet = workbook.GetSheetAt(0);   // 打開第一個sheet頁
                if (sheet != null && source != null && source.Rows.Count > 0)  // 模板內容為空,不做處理
                {
                    IRow row;
                    for (int i = 0, len = source.Rows.Count; i < len; i++)
                    {
                        if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false);   // 不覆蓋,數據向下移

                        #region 第一行,寫入數據後,對變數賦初值
                        if (i == 0) // 第一行,賦初值
                        {
                            row = sheet.CreateRow(rowIndex);
                            #region  創建列並插入數據
                            //創建列並插入數據
                            for (int index = 0; index < cellCount; index++)
                            {
                                ICell cell = row.CreateCell(index);

                                string strValue = !(source.Rows[i][cellKeys[index]] is DBNull) ? source.Rows[i][cellKeys[index]].ToString() : string.Empty;
                                // 其它列數據,數值進行彙總
                                switch (source.Columns[cellKeys[index]].DataType.ToString())
                                {
                                    case "System.Int16": //整型
                                    case "System.Int32":
                                    case "System.Int64":
                                    case "System.Byte":
                                        int intV = 0;
                                        int.TryParse(strValue, out intV);
                                        cell.CellStyle = styleNum;  // 設置格式
                                        cell.SetCellValue(intV);
                                        break;
                                    case "System.Decimal": //浮點型
                                    case "System.Double":
                                    case "System.Single":
                                        double doubV = 0;
                                        double.TryParse(strValue, out doubV);
                                        cell.CellStyle = styleNum;  // 設置格式
                                        cell.SetCellValue(doubV);
                                        break;
                                    default:
                                        cell.CellStyle = styleStr;  // 設置格式
                                        cell.SetCellValue(strValue);
                                        break;
                                }
                            }
                            #endregion

                            if (mergeColumns > 0)
                            {
                                temp0 = source.Rows[i][cellKeys[0]].ToString();  // 保存第1列值
                                start0 = rowIndex;
                                end0 = rowIndex;
                            }
                            if (mergeColumns > 1)
                            {
                                temp1 = source.Rows[i][cellKeys[1]].ToString();  // 保存第2列值                   
                                start1 = rowIndex;
                                end1 = rowIndex;
                            }

                            rowIndex++;
                            continue;
                        }
                        #endregion

                        // 不是第一行數據的處理
                        // 判斷1列值變化沒
                        string cellText0 = source.Rows[i][cellKeys[0]].ToString();
                        if (temp0 != cellText0) // 第1列值有變化
                        {
                            #region 第2列要合併
                            if (mergeColumns > 1)  // 第2列要合併
                            {
                                if (start1 != end1) // 開始行和結束行不相同,才進行合併
                                {
                                    CellRangeAddress region1 = new CellRangeAddress(start1, end1, 1, 1); // 合併第二列
                                    sheet.AddMergedRegion(region1);
                                }

                                #region 第2列加小計
                                if (isTotal) // 加小計
                                {
                                    if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false);   // 不覆蓋,數據向下移

                                    IRow rowTotal1 = sheet.CreateRow(rowIndex);
                                    //創建列並插入數據
                                    #region 插入小計數據
                                    for (int index = 0; index < cellCount; index++)
                                    {
                                        object obj1;
                                        ICell newcell = rowTotal1.CreateCell(index);
                                        if (index == 0)   //第1列
                                        {
                                            newcell.CellStyle = styleTotalStr;
                                            newcell.SetCellValue(temp0);
                                            continue;
                                        }
                                        if (index == 1)   // 第2列
                                        {
                                            newcell.CellStyle = styleTotalStr;
                                            newcell.SetCellValue("小計"); 
                                            continue;
                                        }

                                        // 其它列數據,數值進行彙總
                                        switch (source.Columns[cellKeys[index]].DataType.ToString())
                                        {
                                            case "System.Int16": //整型
                                            case "System.Int32":
                                            case "System.Int64":
                                            case "System.Byte":
                                                obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1));
                                                int intV = 0;
                                                int.TryParse(obj1.ToString(), out intV);
                                                newcell.CellStyle = styleTotalNum;
                                                newcell.SetCellValue(intV);
                                                break;
                                            case "System.Decimal": //浮點型
                                            case "System.Double":
                                            case "System.Single":
                                                obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1));
                                                double doubV = 0;
                                                double.TryParse(obj1.ToString(), out doubV);
                                                newcell.CellStyle = styleTotalNum;
                                                newcell.SetCellValue(doubV);
                                                break;
                                            default:
                                                newcell.CellStyle = styleTotalStr;
                                                newcell.SetCellValue("");
                                                break;
                                        }
                                    }
                                    #endregion

                                    // 合併小計
                                    CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 1, 2); // 合併小計
                                    sheet.AddMergedRegion(region0);

                                }
                                #endregion
                                temp1 = source.Rows[i][cellKeys[1]].ToString();
                                end0++;
                                rowIndex++;
                            }
                            #endregion

                            #region 第1列要合併
                            if (mergeColumns > 0)   // 第1列要合併
                            {
                                if (start0 != end0) // 開始行和結束行不相同,才進行合併
                                {
                                    CellRangeAddress region0 = new CellRangeAddress(start0, end0, 0, 0); // 合併第二列
                                    sheet.AddMergedRegion(region0);
                                }

                                #region 第1列加合計
                                if (isTotal) // 加合計
                                {
                                    if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false);   // 不覆蓋,數據向下移

                                    IRow rowTotal0 = sheet.CreateRow(rowIndex);
                                    //創建列並插入數據
                                    #region 加合計列
                                    for (int index = 0; index < cellCount; index++)
                                    {
                                        object obj1;
                                        ICell newcell = rowTotal0.CreateCell(index);
                                        if (index == 0)
                                        {
                                            newcell.CellStyle = styleTotalStr;
                                            newcell.SetCellValue("合計");  //第1列
                                            continue;
                                        }
                                        if (index == 1)
                                        {
                                            newcell.CellStyle = styleTotalStr;
                                            newcell.SetCellValue("");  // 第2列
                                            continue;
                                        }

                                        switch (source.Columns[cellKeys[index]].DataType.ToString())
                                        {
                                            case "System.Int16": //整型
                                            case "System.Int32":
                                            case "System.Int64":
                                            case "System.Byte":
                                                obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0));
                                                int intV = 0;
                                                int.TryParse(obj1.ToString(), out intV);
                                                newcell.CellStyle = styleTotalNum;
                                                newcell.SetCellValue(intV);
                                                break;
                                            case "System.Decimal": //浮點型
                                            case "System.Double":
                                            case "System.Single":
                                                obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0));
                                                double doubV = 0;
                                                double.TryParse(obj1.ToString(), out doubV);
                                                newcell.CellStyle = styleTotalNum;
                                                newcell.SetCellValue(doubV);
                                                break;
                                            default:
                                                newcell.CellStyle = styleTotalStr;
                                                newcell.SetCellValue("");
                                                break;
                                        }
                                    }
                                    #endregion

                                    // 合併合計
                                    CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 0, 2); // 合併合計
                                    sheet.AddMergedRegion(region0);

                                    end0++;
                                    rowIndex++;
                                }
                                #endregion
                                temp0 = cellText0;
                            }
                            #endregion

                            // 重新賦值
                            start0 = rowIndex;
                            end0 = rowIndex;
                            start1 = rowIndex;
                            end1 = rowIndex;
                        }
                        else  // 第1列值沒有變化
                        {
                            end0++;
                            // 判斷第2列是否有變化
                            string cellText1 = source.Rows[i][cellKeys[1]].ToString();
                            if (cellText1 != temp1)  // 第1列沒變,第2列變化
                            {
                                #region 第2列要合併
                                if (mergeColumns > 1)  // 第2列要合併
                                {
                                    if (start1 != end1) // 開始行和結束行不相同,才進行合併
                                    {
                                        CellRangeAddress region1 = new CellRangeAddress(start1, end1, 1, 1); // 合併第二列
                                        sheet.AddMergedRegion(region1);
                                    }

                                    #region 第2列加小計
                                    if (isTotal) // 加小計
                                    {
                                        if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false);   // 不覆蓋,數據向下移

                                        IRow rowTotal1 = sheet.CreateRow(rowIndex);
                                        //創建列並插入數據
                                        #region 插入小計數據
                                        for (int index = 0; index < cellCount; index++)
                                        {
                                            object obj1;
                                            ICell newcell = rowTotal1.CreateCell(index);
                                            if (index == 0)   //第1列
                                            {
                                                newcell.CellStyle = styleTotalStr;
                                                newcell.SetCellValue(temp0);
                                                continue;
                                            }
                                            if (index == 1)   // 第2列
                                            {
                                                newcell.CellStyle = styleTotalStr;
                                                newcell.SetCellValue("小計");
                                                continue;
                                            }

                                            // 其它列數據,數值進行彙總
                                            switch (source.Columns[cellKeys[index]].DataType.ToString())
                                            {
                                                case "System.Int16": //整型
                                                case "System.Int32":
                                                case "System.Int64":
                                                case "System.Byte":
                                                    obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1));
                                                    int intV = 0;
                                                    int.TryParse(obj1.ToString(), out intV);
                                                    newcell.CellStyle = styleTotalNum;
                                                    newcell.SetCellValue(intV);
                                                    break;
                                                case "System.Decimal": //浮點型
                                                case "System.Double":
                                                case "System.Single":
                                                    obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1));
                                                    double doubV = 0;
                                                    double.TryParse(obj1.ToString(), out doubV);
                                                    newcell.CellStyle = styleTotalNum;
                                                    newcell.SetCellValue(doubV);
                                                    break;
                                                default:
                                                    newcell.CellStyle = styleTotalStr;
                                                    newcell.SetCellValue("");
                                                    break;
                                            }
                                        }
                                        #endregion
                                        // 合併小計
                                        CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 1, 2); // 合併小計
                                        sheet.AddMergedRegion(region0);

                                        end0++;
                                        rowIndex++;
                                    }
                                    temp1 = cellText1;  // 要合併,才進行重新賦值
                                    start1 = rowIndex;
                                    end1 = rowIndex;
                                    #endregion
                                }
                                #endregion
                            }
                            else  // 第1列值沒變,第2列也沒變
                                end1++;
                        }

                        // 插入當前數據
                        row = sheet.CreateRow(rowIndex);
                        #region  創建行並插入當前記錄的數據
                        //創建行並插入當前記錄的數據
                        for (int index = 0; index < cellCount; index++)
                        {
                            ICell cell = row.CreateCell(index);
string strValue = !(source.Rows[i][cellKeys[index]] is DBNull) ? source.Rows[i][cellKeys[index]].ToString() : string.Empty; // 取值 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(strValue, out intV); cell.CellStyle = styleNum; cell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": double doubV = 0; double.TryParse(strValue, out doubV); cell.CellStyle = styleNum; cell.SetCellValue(doubV); break; default: cell.CellStyle = styleStr; cell.SetCellValue(strValue); break; } } #endregion // 下移一行 rowIndex++; } // 最後一條記錄的合計 #region 對第2列進行合併 if (mergeColumns > 1) // 對第2列合併 { if (start1 != end1) // 開始行和結束行不等,進行合併 { CellRangeAddress region1 = new CellRangeAddress(start1, end1, 1, 1); // 合併第二列 sheet.AddMergedRegion(region1); } #region 第2列加小計 if (isTotal) // 加小計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal1 = sheet.CreateRow(rowIndex); //創建列並插入數據 #region 插入小計數據 for (int index = 0; index < cellCount; index++) { object obj1; ICell newcell = rowTotal1.CreateCell(index); #region 列值處理 if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue(temp0); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue("小計"); continue; } // 其它列數據,數值進行彙總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); int intV = 0; int.TryParse(obj1.ToString(), out intV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); double doubV = 0; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); break; } #endregion } #endregion // 合併小計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 1, 2); // 合併小計 sheet.AddMergedRegion(region0); rowIndex++; end0++; } #endregion } #endregion #region 對第1列合併 if (mergeColumns > 0) // 對第1列合併 { if (start0 != end0) // 開始行和結束行不等,進行合併 { CellRangeAddress region1 = new CellRangeAddress(start0, end0, 0, 0); // 合併第二列 sheet.AddMergedRegion(region1); } #region 第1列加合計 if (isTotal) // 加合計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal0 = sheet.CreateRow(rowIndex); //創建列並插入數據 #region 插入合計數據 for (int index = 0; index < cellCount; index++) { object obj1; ICell newcell = rowTotal0.CreateCell(index); #region 列值處理 if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue("合計"); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); continue; } // 其它列數據,數值進行彙總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0)); int intV = 0; newcell.CellStyle = styleTotalNum; int.TryParse(obj1.ToString(), out intV); newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0)); double doubV = 0; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); break; } #endregion } #endregion // 合併合計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 0, 2); // 合併合計 sheet.AddMergedRegion(region0); } rowIndex++; #endregion } #endregion #region 進行彙總 - 加總計 if (addAllTotal) // 加總計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal0 = sheet.CreateRow(rowIndex); //創建列並插入數據 #region 插入總計數據 for (int index = 0; index < cellCount; index++) { object obj1; ICell newcell = rowTotal0.CreateCell(index); #region 列值處理 if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue("總計"); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); continue; } // 其它列數據,數值進行彙總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), ""); int intV = 0; int.TryParse(obj1.ToString(), out intV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), ""); double doubV = 0; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); break; } #endregion } #endregion // 合併總計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 0, 2); // 合併總計 sheet.AddMergedRegion(region0); } #endregion } return Save2Xls(strFileName, workbook); // 保存為xls文件 } catch (Exception ex) { // FileHelper.WriteLine(logfile, "處理數據異常:" + ex.Message); // msg = ex.Message; } return bn; }

 

  保存文件的代碼:

        public static bool Save2Xls(string fileName, IWorkbook workbook)
        {
            bool bn = false;
            try
            {
                FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);

                MemoryStream ms = new MemoryStream();
                workbook.Write(ms);
                BinaryWriter w = new BinaryWriter(fs);
                w.Write(ms.ToArray());
                fs.Close();
                ms.Close();

                bn = true;
            }
            catch(Exception ex)
            {
                //FileHelper.WriteLine(logfile, "保存文件異常:" + ex.Message);
            }
            return bn;
        }

  

  希望對大家有用。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 返回總目錄 本小節目錄 Extract BaseClass(提煉基類) Extract Interface(提煉介面) Collapse Hierarchy(摺疊繼承體系) 7Extract BaseClass(提煉基類) 概要 兩個類有相似特性。為這兩個類建立一個基類,將相同特性移至基類。 動機 ...
  • 跟同事交流,之前上線的系統一兩年之後,數據有兩三千萬 系統,沒有辦法很好的應對這麼多的數據 這有兩方面原因,一個是設計的時候沒有怎麼考慮數據量的問題 還有一個就是寫代碼的時候,並沒有註意數據量的問題 不去關註數據量的問題,這可能是程式員自己的意識,還有可能是客戶自以為的不用關註 客戶說,我們的數據沒 ...
  • 前言 如果大家剛使用EntityFramework Core作為ORM框架的話,想必都會遇到資料庫遷移的一些問題。 起初我是在ASP.NET Core的Web項目中進行的,但後來發現放在此處並不是很合理,一些關於資料庫的遷移,比如新增表,欄位,修改欄位類型等等,不應該和最上層的Web項目所關聯,數據 ...
  • 下麵這個字元串數組: 實現這個要求的方法也許會很多。下麵Insus.NET使用一個通用的方法來實現:面向對象,創建一個類別Class Digit: class Digit { private int _D; public int D { get { return _D; } set { _D = v ...
  • 通過手機號獲取歸屬地。及控制項LitJosn.dll的簡單使用。 ...
  • 布爾(對應C#的bool)表示是/否兩種狀態,對應關鍵字true、false。對象(對應C#的object)表示任意對象,是所有類型的基類型,關鍵字null表示空對象。Object 在S#中有大量的使用,用的好了熟了會讓你領悟:看山是山;看山不是山;看山還是山。 ...
  • 調試步驟 遠程伺服器: 1.找到本地vs安裝目錄,Enterprise\Common7\IDE目錄下的Remote Debugger整個文件夾複製到遠程伺服器 2.根據伺服器的系統類型,選擇其中的x64或x86文件夾,以管理員身份運行msvsmon.exe 3.將vs生成的項目文件發佈到遠程伺服器, ...
  • 1 //定義一個委托 2 static Func delFunc = (a, b) => 3 { 4 Console.WriteLine("委托線程:" + Thread.CurrentThread.ManagedThreadId); 5 return (a + b).ToString(); 6 }... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...