コード例 #1
0
        /// -----------------------------------------------------------------------------
        /// <summary>
        ///     DataTableをもとにxlsxファイルを作成しPDF化</summary>
        /// <param name="dtUriage">
        ///     売上管理表のデータテーブル</param>
        /// -----------------------------------------------------------------------------
        public string dbToPdf(DataTable dtUriage, List <string> lstItem, string pr, int num)
        {
            string strWorkPath = System.Configuration.ConfigurationManager.AppSettings["workpath"];
            string strDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
            string strNow      = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

            Microsoft.Office.Interop.Excel.Application objExcel     = null;
            Microsoft.Office.Interop.Excel.Workbooks   objWorkBooks = null;
            Microsoft.Office.Interop.Excel.Workbook    objWorkBook  = null;
            Microsoft.Office.Interop.Excel.Worksheet   objWorkSheet = null;
            Microsoft.Office.Interop.Excel.Range       objRange     = null;

            //int pageRows = 38;
            int pageRows = 47;

            try
            {
                CreatePdf pdf = new CreatePdf();

                // ワークブックのデフォルトフォント、フォントサイズの指定
                XLWorkbook.DefaultStyle.Font.FontName = "MS 明朝";
                XLWorkbook.DefaultStyle.Font.FontSize = 9;

                // excelのインスタンス生成
                XLWorkbook workbook = new XLWorkbook(XLEventTracking.Disabled);

                IXLWorksheet worksheet    = workbook.Worksheets.Add("Header");
                IXLWorksheet headersheet  = worksheet;  // ヘッダーシート
                IXLWorksheet currentsheet = worksheet;  // 処理中シート


                //Linqで必要なデータをselect
                var outDataAll = dtUriage.AsEnumerable()
                                 .Select(dat => new
                {
                    groupCd           = dat["グループコード"],
                    groupName         = dat["グループ名"],
                    tantoCd           = dat["担当者コード"],
                    tantoName         = dat["担当者名"],
                    tokuisakiCd       = dat["得意先コード"],
                    tokuisakiName     = dat["得意先名"],
                    uriage            = (decimal)dat["売上額"],
                    arari             = (decimal)dat["粗利額"],
                    arariRitsu        = (decimal)dat["粗利率"],
                    getsumatsuUriage  = (decimal)dat["月末迄受注残売上"],
                    getsumatsuArari   = (decimal)dat["月末迄受注残粗利"],
                    yokugetsuUriage   = (decimal)dat["翌月以降受注残売上"],
                    yokugetsuArari    = (decimal)dat["翌月以降受注残粗利"],
                    getsumatsuUrikake = (decimal)dat["月末売掛金残"],
                    nyukin            = (decimal)dat["当月入金額"]
                }).ToList();

                // linqで合計算出
                decimal[] decKingaku = new decimal[9];
                decKingaku[0] = outDataAll.Select(gokei => gokei.uriage).Sum();
                decKingaku[1] = outDataAll.Select(gokei => gokei.arari).Sum();
                decKingaku[2] = outDataAll.Select(gokei => gokei.arariRitsu).Sum();
                decKingaku[3] = outDataAll.Select(gokei => gokei.getsumatsuUriage).Sum();
                decKingaku[4] = outDataAll.Select(gokei => gokei.getsumatsuArari).Sum();
                decKingaku[5] = outDataAll.Select(gokei => gokei.yokugetsuUriage).Sum();
                decKingaku[6] = outDataAll.Select(gokei => gokei.yokugetsuArari).Sum();
                decKingaku[7] = outDataAll.Select(gokei => gokei.getsumatsuUrikake).Sum();
                decKingaku[8] = outDataAll.Select(gokei => gokei.nyukin).Sum();

                // 担当者計
                var tantoGoukei = from tbl in dtUriage.AsEnumerable()
                                  group tbl by tbl.Field <string>("担当者コード") into g
                                  select new
                {
                    section           = g.Key,
                    count             = g.Count(),
                    uriage            = g.Sum(p => p.Field <decimal>("売上額")),
                    arari             = g.Sum(p => p.Field <decimal>("粗利額")),
                    arariRitsu        = g.Sum(p => p.Field <decimal>("粗利率")),
                    getsumatsuUriage  = g.Sum(p => p.Field <decimal>("月末迄受注残売上")),
                    getsumatsuArari   = g.Sum(p => p.Field <decimal>("月末迄受注残粗利")),
                    yokugetsuUriage   = g.Sum(p => p.Field <decimal>("翌月以降受注残売上")),
                    yokugetsuArari    = g.Sum(p => p.Field <decimal>("翌月以降受注残粗利")),
                    getsumatsuUrikake = g.Sum(p => p.Field <decimal>("月末売掛金残")),
                    nyukin            = g.Sum(p => p.Field <decimal>("当月入金額"))
                };

                // 担当者計の合計算出
                decimal[,] decKingakuTanto = new decimal[tantoGoukei.Count(), 9];
                for (int cnt = 0; cnt < tantoGoukei.Count(); cnt++)
                {
                    decKingakuTanto[cnt, 0] = tantoGoukei.ElementAt(cnt).uriage;
                    decKingakuTanto[cnt, 1] = tantoGoukei.ElementAt(cnt).arari;
                    decKingakuTanto[cnt, 2] = tantoGoukei.ElementAt(cnt).arariRitsu;
                    decKingakuTanto[cnt, 3] = tantoGoukei.ElementAt(cnt).getsumatsuUriage;
                    decKingakuTanto[cnt, 4] = tantoGoukei.ElementAt(cnt).getsumatsuArari;
                    decKingakuTanto[cnt, 5] = tantoGoukei.ElementAt(cnt).yokugetsuUriage;
                    decKingakuTanto[cnt, 6] = tantoGoukei.ElementAt(cnt).yokugetsuArari;
                    decKingakuTanto[cnt, 7] = tantoGoukei.ElementAt(cnt).getsumatsuUrikake;
                    decKingakuTanto[cnt, 8] = tantoGoukei.ElementAt(cnt).nyukin;
                }

                // グループ計
                var groupGoukei = from tbl in dtUriage.AsEnumerable()
                                  group tbl by tbl.Field <string>("グループコード") into g
                                  select new
                {
                    section           = g.Key,
                    count             = g.Count(),
                    uriage            = g.Sum(p => p.Field <decimal>("売上額")),
                    arari             = g.Sum(p => p.Field <decimal>("粗利額")),
                    arariRitsu        = g.Sum(p => p.Field <decimal>("粗利率")),
                    getsumatsuUriage  = g.Sum(p => p.Field <decimal>("月末迄受注残売上")),
                    getsumatsuArari   = g.Sum(p => p.Field <decimal>("月末迄受注残粗利")),
                    yokugetsuUriage   = g.Sum(p => p.Field <decimal>("翌月以降受注残売上")),
                    yokugetsuArari    = g.Sum(p => p.Field <decimal>("翌月以降受注残粗利")),
                    getsumatsuUrikake = g.Sum(p => p.Field <decimal>("月末売掛金残")),
                    nyukin            = g.Sum(p => p.Field <decimal>("当月入金額"))
                };

                // グループ計の合計算出
                decimal[,] decKingakuGroup = new decimal[groupGoukei.Count(), 9];
                for (int cnt = 0; cnt < groupGoukei.Count(); cnt++)
                {
                    decKingakuGroup[cnt, 0] = groupGoukei.ElementAt(cnt).uriage;
                    decKingakuGroup[cnt, 1] = groupGoukei.ElementAt(cnt).arari;
                    decKingakuGroup[cnt, 2] = groupGoukei.ElementAt(cnt).arariRitsu;
                    decKingakuGroup[cnt, 3] = groupGoukei.ElementAt(cnt).getsumatsuUriage;
                    decKingakuGroup[cnt, 4] = groupGoukei.ElementAt(cnt).getsumatsuArari;
                    decKingakuGroup[cnt, 5] = groupGoukei.ElementAt(cnt).yokugetsuUriage;
                    decKingakuGroup[cnt, 6] = groupGoukei.ElementAt(cnt).yokugetsuArari;
                    decKingakuGroup[cnt, 7] = groupGoukei.ElementAt(cnt).getsumatsuUrikake;
                    decKingakuGroup[cnt, 8] = groupGoukei.ElementAt(cnt).nyukin;
                }

                // リストをデータテーブルに変換
                DataTable dtChkList = pdf.ConvertToDataTable(outDataAll);

                int maxColCnt = dtChkList.Columns.Count;
                int rowCnt    = 1;  // datatable処理行カウント
                int xlsRowCnt = 5;  // Excel出力行カウント(開始は出力行)

                int tantoCnt    = 0;
                int tantoRowCnt = 0;
                int groupCnt    = 0;
                int groupRowCnt = 0;

                // ClosedXMLで1行ずつExcelに出力
                foreach (DataRow drUriage in dtChkList.Rows)
                {
                    // 1ページ目のシート作成
                    if (rowCnt == 1)
                    {
                        // タイトル出力(中央揃え、セル結合)
                        IXLCell titleCell = headersheet.Cell("A1");
                        titleCell.Value = "得意先別売上管理表";
                        titleCell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                        titleCell.Style.Font.FontSize        = 16;
                        headersheet.Range("A1", "M1").Merge();

                        // 開始年月日、終了年月日出力(A3のセル)
                        IXLCell unitCell = headersheet.Cell("A3");
                        unitCell.Value = "期間::" +
                                         string.Format("{0:yyyy年MM月dd日}", DateTime.Parse(lstItem[0])) + "~" +
                                         string.Format("{0:yyyy年MM月dd日}", DateTime.Parse(lstItem[1]));
                        unitCell.Style.Font.FontSize = 10;

                        // ヘッダー出力(3行目のセル)
                        headersheet.Cell("H3").Value = "指定期間内受注残";
                        headersheet.Range("H3", "I3").Merge();
                        headersheet.Cell("J3").Value = "指定期間以降受注残";
                        headersheet.Range("J3", "K3").Merge();

                        // ヘッダー出力(4行目のセル)
                        headersheet.Cell("A4").Value = "グループ名";
                        headersheet.Cell("B4").Value = "担当者名";
                        headersheet.Cell("C4").Value = "コード";
                        headersheet.Cell("D4").Value = "得意先名";
                        headersheet.Cell("E4").Value = "売上額";
                        headersheet.Cell("F4").Value = "粗利額";
                        headersheet.Cell("G4").Value = "粗利率";
                        headersheet.Cell("H4").Value = "金 額";
                        headersheet.Cell("I4").Value = "粗 利";
                        headersheet.Cell("J4").Value = "金 額";
                        headersheet.Cell("K4").Value = "粗 利";
                        headersheet.Cell("L4").Value = "月末売掛金残";
                        headersheet.Cell("M4").Value = "当月入金額";

                        // ヘッダー列
                        headersheet.Range("H3", "K3").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                        headersheet.Range("A4", "M4").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;

                        // セルの周囲に罫線を引く
                        headersheet.Range("H3", "K3").Style
                        .Border.SetTopBorder(XLBorderStyleValues.Thin)
                        .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                        .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                        .Border.SetRightBorder(XLBorderStyleValues.Thin);
                        headersheet.Range("A4", "M4").Style
                        .Border.SetTopBorder(XLBorderStyleValues.Thin)
                        .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                        .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                        .Border.SetRightBorder(XLBorderStyleValues.Thin);

                        // セルの背景色
                        headersheet.Range("H3", "K3").Style.Fill.BackgroundColor = XLColor.LightGray;
                        headersheet.Range("A4", "M4").Style.Fill.BackgroundColor = XLColor.LightGray;

                        // 列幅の指定
                        headersheet.Column(1).Width = 10;
                        headersheet.Column(2).Width = 10;
                        headersheet.Column(3).Width = 5.4;
                        headersheet.Column(4).Width = 30;
                        headersheet.Column(5).Width = 12;
                        headersheet.Column(6).Width = 12;
                        headersheet.Column(7).Width = 8;
                        for (int cnt = 8; cnt <= 13; cnt++)
                        {
                            headersheet.Column(cnt).Width = 12;
                        }

                        // 印刷体裁(A4横、印刷範囲)
                        headersheet.PageSetup.PaperSize       = XLPaperSize.A4Paper;
                        headersheet.PageSetup.PageOrientation = XLPageOrientation.Landscape;
                        headersheet.PageSetup.Margins.Left    = 0.2;
                        headersheet.PageSetup.Margins.Right   = 0.2;

                        // ヘッダー部の指定(番号)
                        headersheet.PageSetup.Header.Left.AddText("(№63)");
                    }

                    // グループ名出力
                    if (groupRowCnt == 0)
                    {
                        xlsRowCnt = 5;

                        // ヘッダーシートのコピー
                        pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);

                        currentsheet.Cell(xlsRowCnt, 1).Value = drUriage[1];
                    }

                    // 担当者名出力
                    if (tantoRowCnt == 0)
                    {
                        currentsheet.Cell(xlsRowCnt, 2).Value = drUriage[3];

                        // 1行分のセルの周囲に罫線を引く
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt, 13).Style
                        .Border.SetTopBorder(XLBorderStyleValues.Thin)
                        .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                        .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                        .Border.SetRightBorder(XLBorderStyleValues.Thin);

                        xlsRowCnt++;
                    }

                    // 35行毎(ヘッダーを除いた行数)にシート作成
                    if (xlsRowCnt == pageRows + 1)
                    {
                        xlsRowCnt = 5;

                        // ヘッダーシートのコピー
                        pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                    }

                    // 1セルずつデータ出力
                    for (int colCnt = 4; colCnt < maxColCnt; colCnt++)
                    {
                        string str = drUriage[colCnt].ToString();

                        // 金額セルの処理
                        if (colCnt == 6 || colCnt == 7 || colCnt >= 9 && colCnt <= 14)
                        {
                            // 3桁毎に","を挿入する
                            str = string.Format("{0:#,0}", decimal.Parse(str));
                            currentsheet.Cell(xlsRowCnt, colCnt - 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                        }

                        // 粗利率セルの処理
                        if (colCnt == 8)
                        {
                            // 3桁毎に","を挿入する、小数点第2位まで
                            currentsheet.Cell(xlsRowCnt, colCnt - 1).Style.NumberFormat.SetFormat("#,##0.00");
                            currentsheet.Cell(xlsRowCnt, colCnt - 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                        }

                        currentsheet.Cell(xlsRowCnt, colCnt - 1).Value = str;
                    }

                    // 1行分のセルの周囲に罫線を引く
                    currentsheet.Range(xlsRowCnt, 1, xlsRowCnt, 13).Style
                    .Border.SetTopBorder(XLBorderStyleValues.Thin)
                    .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                    .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                    .Border.SetRightBorder(XLBorderStyleValues.Thin);

                    // 35行毎(ヘッダーを除いた行数)にシート作成
                    if (xlsRowCnt == pageRows)
                    {
                        xlsRowCnt = 4;

                        // ヘッダーシートのコピー
                        pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                    }

                    // 担当者計を出力
                    tantoRowCnt++;
                    if (tantoGoukei.ElementAt(tantoCnt).count == tantoRowCnt)
                    {
                        xlsRowCnt++;

                        // セル結合
                        currentsheet.Range(xlsRowCnt, 2, xlsRowCnt, 3).Merge();

                        currentsheet.Cell(xlsRowCnt, 4).Value = "◆担当者計◆";
                        for (int cnt = 0; cnt < 9; cnt++)
                        {
                            // 粗利率の場合
                            if (cnt == 2)
                            {
                                // 売上額が0でない場合
                                if (decKingakuTanto[tantoCnt, 0] != 0)
                                {
                                    decKingakuTanto[tantoCnt, cnt] = decKingakuTanto[tantoCnt, 1] / decKingakuTanto[tantoCnt, 0] * 100;
                                }
                                else
                                {
                                    decKingakuTanto[tantoCnt, cnt] = 0;
                                }
                                currentsheet.Cell(xlsRowCnt, cnt + 5).Value = decKingakuTanto[tantoCnt, cnt].ToString();
                                currentsheet.Cell(xlsRowCnt, cnt + 5).Style.NumberFormat.SetFormat("#,##0.00");
                            }
                            else
                            {
                                currentsheet.Cell(xlsRowCnt, cnt + 5).Value = string.Format("{0:#,0}", decKingakuTanto[tantoCnt, cnt]);
                            }
                            currentsheet.Cell(xlsRowCnt, cnt + 5).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                        }

                        // 1行分のセルの周囲に罫線を引く
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt, 13).Style
                        .Border.SetTopBorder(XLBorderStyleValues.Thin)
                        .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                        .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                        .Border.SetRightBorder(XLBorderStyleValues.Thin);

                        tantoCnt++;
                        tantoRowCnt = 0;
                    }

                    // 35行毎(ヘッダーを除いた行数)にシート作成
                    if (xlsRowCnt == pageRows)
                    {
                        xlsRowCnt = 4;

                        // ヘッダーシートのコピー
                        pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                    }

                    // グループ計を出力
                    groupRowCnt++;
                    if (groupGoukei.ElementAt(groupCnt).count == groupRowCnt)
                    {
                        xlsRowCnt++;

                        // セル結合
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt, 3).Merge();

                        currentsheet.Cell(xlsRowCnt, 4).Value = "◆グループ計◆";
                        for (int cnt = 0; cnt < 9; cnt++)
                        {
                            // 粗利率の場合
                            if (cnt == 2)
                            {
                                // 売上額が0でない場合
                                if (decKingakuGroup[groupCnt, 0] != 0)
                                {
                                    decKingakuGroup[groupCnt, cnt] = decKingakuGroup[groupCnt, 1] / decKingakuGroup[groupCnt, 0] * 100;
                                }
                                else
                                {
                                    decKingakuGroup[groupCnt, cnt] = 0;
                                }
                                currentsheet.Cell(xlsRowCnt, cnt + 5).Value = decKingakuGroup[groupCnt, cnt].ToString();
                                currentsheet.Cell(xlsRowCnt, cnt + 5).Style.NumberFormat.SetFormat("#,##0.00");
                            }
                            else
                            {
                                currentsheet.Cell(xlsRowCnt, cnt + 5).Value = string.Format("{0:#,0}", decKingakuGroup[groupCnt, cnt]);
                            }
                            currentsheet.Cell(xlsRowCnt, cnt + 5).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                        }

                        // 1行分のセルの周囲に罫線を引く
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt, 13).Style
                        .Border.SetTopBorder(XLBorderStyleValues.Thin)
                        .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                        .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                        .Border.SetRightBorder(XLBorderStyleValues.Thin);

                        groupCnt++;
                        groupRowCnt = 0;
                    }

                    // 35行毎(ヘッダーを除いた行数)にシート作成
                    if (xlsRowCnt == pageRows)
                    {
                        xlsRowCnt = 4;

                        // ヘッダーシートのコピー
                        pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                    }

                    rowCnt++;
                    xlsRowCnt++;
                }

                // 最終行を出力した後、合計行を出力
                if (dtChkList.Rows.Count > 0)
                {
                    // セル結合
                    currentsheet.Range(xlsRowCnt, 1, xlsRowCnt, 3).Merge();

                    currentsheet.Cell(xlsRowCnt, 4).Value = "◆総合計◆";
                    for (int cnt = 0; cnt < 9; cnt++)
                    {
                        // 粗利率の場合
                        if (cnt == 2)
                        {
                            // 売上額が0でない場合
                            if (decKingaku[0] != 0)
                            {
                                decKingaku[cnt] = decKingaku[1] / decKingaku[0] * 100;
                            }
                            else
                            {
                                decKingaku[cnt] = 0;
                            }
                            currentsheet.Cell(xlsRowCnt, cnt + 5).Value = decKingaku[cnt].ToString();
                            currentsheet.Cell(xlsRowCnt, cnt + 5).Style.NumberFormat.SetFormat("#,##0.00");
                        }
                        else
                        {
                            currentsheet.Cell(xlsRowCnt, cnt + 5).Value = string.Format("{0:#,0}", decKingaku[cnt]);
                        }
                        currentsheet.Cell(xlsRowCnt, cnt + 5).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                    }

                    // 1行分のセルの周囲に罫線を引く
                    currentsheet.Range(xlsRowCnt, 1, xlsRowCnt, 13).Style
                    .Border.SetTopBorder(XLBorderStyleValues.Thin)
                    .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                    .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                    .Border.SetRightBorder(XLBorderStyleValues.Thin);
                }

                // ヘッダーシート削除
                headersheet.Delete();

                // 各ページのヘッダー部を指定
                int maxPage = workbook.Worksheets.Count;
                for (int pageCnt = 1; pageCnt <= maxPage; pageCnt++)
                {
                    // ヘッダー部に指定する情報を取得
                    string strHeader = pdf.getHeader(pageCnt, maxPage, strNow);

                    // ヘッダー部の指定(コンピュータ名、日付、ページ数を出力)
                    workbook.Worksheet(pageCnt).PageSetup.Header.Right.AddText(strHeader);
                }

                // workbookを保存
                string strOutXlsFile = strWorkPath + strDateTime + ".xlsx";
                workbook.SaveAs(strOutXlsFile);

                // workbookを解放
                workbook.Dispose();

                // PDF化の処理
                //return pdf.createPdf(strOutXlsFile, strDateTime, 0);

                objExcel         = new Microsoft.Office.Interop.Excel.Application();
                objExcel.Visible = false;

                if (pr != null)
                {
                    objExcel.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMinimized;
                }
                else
                {
                    objExcel.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;
                }

                objExcel.DisplayAlerts = false;

                objWorkBooks = objExcel.Workbooks;

                String strP = System.IO.Path.GetFullPath(strOutXlsFile);

                objWorkBook = objWorkBooks.Open(strP,         //_xslFile,     // FileName:ファイル名
                                                Type.Missing, // UpdateLinks:ファイル内の外部参照の更新方法
                                                Type.Missing, // ReadOnly:ReadOnlyにするかどうか
                                                Type.Missing, // Format: テキストファイルを開く場合に区切り文字を指定する
                                                Type.Missing, // Password:開く際にパスワードがある場合にパスワードを入力
                                                Type.Missing, // WriteResPassword:書き込む際にパスワードがある場合にパスワードを入力
                                                Type.Missing, // IgnoreReadOnlyRecommended:[読み取り専用を推奨する]チェックがオンの場合でも[読み取り専用を推奨する]メッセージを非表示
                                                Type.Missing, // Origin:テキストファイルの場合、プラットフォームを指定
                                                Type.Missing, // Delimiter:テキストファイルで且つ引数Formatが6の場合に区切り文字を指定
                                                Type.Missing, // Editable:Excel4.0アドインの場合、アドインウィンドウを出すか指定
                                                Type.Missing, // Notify:ファイルが読み取りor書き込みモードで開けない場合に通知リストに追加するか指定
                                                Type.Missing, // Converter:ファイルを開くときに最初に使用するファイルコンバーターのインデックス番号を指定
                                                Type.Missing, // AddToMru:最近使用したファイルの一覧にブックを追加するか指定
                                                Type.Missing, // Local:Excel言語設定に合わせてファイルを保存するか指定
                                                Type.Missing  // CorruptLoad:使用できる定数は[xlNormalLoad][xlRepairFile][xlExtractData]。指定がない場合のは[xlNormalLoad]になりOMを通じて開始するときに回復は行われません。
                                                );

                if (pr != null)
                {
                    for (int ip = 0; ip < num; ip++)
                    {
                        objWorkBook.PrintOut(Type.Missing, // From:印刷開始のページ番号
                                             Type.Missing, // To:印刷終了のページ番号
                                             1,            // Copies:印刷部数
                                             Type.Missing, // Preview:印刷プレビューをするか指定
                                             pr,           // ActivePrinter:プリンターの名称
                                             Type.Missing, // PrintToFile:ファイル出力をするか指定
                                             true,         // Collate:部単位で印刷するか指定
                                             Type.Missing  // PrToFileName	:出力先ファイルの名前を指定するかどうか
                                             );
                    }
                }
                else
                {
                    objWorkBook.PrintOut(Type.Missing, // From:印刷開始のページ番号
                                         Type.Missing, // To:印刷終了のページ番号
                                         1,            // Copies:印刷部数
                                         true,         // Preview:印刷プレビューをするか指定
                                         pr,           // ActivePrinter:プリンターの名称
                                         Type.Missing, // PrintToFile:ファイル出力をするか指定
                                         true,         // Collate:部単位で印刷するか指定
                                         Type.Missing  // PrToFileName	:出力先ファイルの名前を指定するかどうか
                                         );
                    objExcel.Visible = true;
                    objWorkBook.Activate();
                }

                return("");
            }
            catch
            {
                throw;
            }
            finally
            {
                // EXCEL終了処理
                if (objWorkSheet != null)
                {
                    Marshal.ReleaseComObject(objWorkSheet);     // オブジェクト参照を解放
                    objWorkSheet = null;                        // オブジェクト解放
                }

                if (objWorkBook != null)
                {
                    objWorkBook.Close(false,
                                      Type.Missing, Type.Missing); //ファイルを閉じる
                    Marshal.ReleaseComObject(objWorkBook);         // オブジェクト参照を解放
                    objWorkBook = null;                            // オブジェクト解放
                }

                if (objWorkBooks != null)
                {
                    Marshal.ReleaseComObject(objWorkBooks);     // オブジェクト参照を解放
                    objWorkBooks = null;                        // オブジェクト解放
                }
                if (objExcel != null)
                {
                    objExcel.Quit();                            // EXCELを閉じる

                    Marshal.ReleaseComObject(objExcel);         // オブジェクト参照を解放
                    objExcel = null;                            // オブジェクト解放
                }

                System.GC.Collect();
                // Workフォルダの全ファイルを取得
                string[] files = System.IO.Directory.GetFiles(strWorkPath, "*", System.IO.SearchOption.AllDirectories);
                // Workフォルダ内のファイル削除
                foreach (string filepath in files)
                {
                    //File.Delete(filepath);
                }
            }
        }
コード例 #2
0
        /// -----------------------------------------------------------------------------
        /// <summary>
        ///     DataTableをもとにxlsxファイルを作成しPDF化</summary>
        /// <param name="lstDtSuiihyo">
        ///     推移表のデータテーブルのリスト</param>
        /// -----------------------------------------------------------------------------
        public string dbToPdf(List <DataTable> lstDtSuiihyo, List <string> lstItem)
        {
            string strWorkPath = System.Configuration.ConfigurationManager.AppSettings["workpath"];
            string strDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
            string strNow      = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

            try
            {
                CreatePdf pdf = new CreatePdf();

                // ワークブックのデフォルトフォント、フォントサイズの指定
                XLWorkbook.DefaultStyle.Font.FontName = "MS 明朝";
                XLWorkbook.DefaultStyle.Font.FontSize = 9;

                // excelのインスタンス生成
                XLWorkbook workbook = new XLWorkbook(XLEventTracking.Disabled);

                IXLWorksheet worksheet    = workbook.Worksheets.Add("Header");
                IXLWorksheet headersheet  = worksheet; // ヘッダーシート
                IXLWorksheet currentsheet = worksheet; // 処理中シート

                int maxPage;                           // 最大ページ数

                // リストに格納しているデータテーブルすべてを実行
                for (int listCnt = 0; listCnt < lstDtSuiihyo.Count; listCnt++)
                {
                    DataTable dtSuiihyo = lstDtSuiihyo[listCnt];

                    if (dtSuiihyo == null || dtSuiihyo.Rows.Count == 0)
                    {
                        break;
                    }

                    //Linqで必要なデータをselect
                    var outDataAll = dtSuiihyo.AsEnumerable()
                                     .Select(dat => new
                    {
                        tantoCd         = dat["担当者コード"],
                        tantoName       = dat["担当者名"],
                        tokuisakiCd     = dat["得意先コード"],
                        tokuisakiName   = dat["得意先名"],
                        zenUriage1      = (decimal)dat["前売上1"],
                        zenUriage2      = (decimal)dat["前売上2"],
                        zenUriage3      = (decimal)dat["前売上3"],
                        zenUriage4      = (decimal)dat["前売上4"],
                        zenUriage5      = (decimal)dat["前売上5"],
                        zenUriage6      = (decimal)dat["前売上6"],
                        zenUriage7      = (decimal)dat["前売上7"],
                        zenUriage8      = (decimal)dat["前売上8"],
                        zenUriage9      = (decimal)dat["前売上9"],
                        zenUriage10     = (decimal)dat["前売上10"],
                        zenUriage11     = (decimal)dat["前売上11"],
                        zenUriage12     = (decimal)dat["前売上12"],
                        zenUriageGoukei = (decimal)dat["前売上合計"],
                        honUriage1      = (decimal)dat["本売上1"],
                        honUriage2      = (decimal)dat["本売上2"],
                        honUriage3      = (decimal)dat["本売上3"],
                        honUriage4      = (decimal)dat["本売上4"],
                        honUriage5      = (decimal)dat["本売上5"],
                        honUriage6      = (decimal)dat["本売上6"],
                        honUriage7      = (decimal)dat["本売上7"],
                        honUriage8      = (decimal)dat["本売上8"],
                        honUriage9      = (decimal)dat["本売上9"],
                        honUriage10     = (decimal)dat["本売上10"],
                        honUriage11     = (decimal)dat["本売上11"],
                        honUriage12     = (decimal)dat["本売上12"],
                        honUriageGoukei = (decimal)dat["本売上合計"]
                    }).ToList();

                    // linqで前売上1~前売上12、前売上合計、本売上1~本売上12、本売上合計の合計算出
                    decimal[,] decKingaku = new decimal[2, 13];
                    decKingaku[0, 0]      = outDataAll.Select(gokei => gokei.zenUriage1).Sum();
                    decKingaku[0, 1]      = outDataAll.Select(gokei => gokei.zenUriage2).Sum();
                    decKingaku[0, 2]      = outDataAll.Select(gokei => gokei.zenUriage3).Sum();
                    decKingaku[0, 3]      = outDataAll.Select(gokei => gokei.zenUriage4).Sum();
                    decKingaku[0, 4]      = outDataAll.Select(gokei => gokei.zenUriage5).Sum();
                    decKingaku[0, 5]      = outDataAll.Select(gokei => gokei.zenUriage6).Sum();
                    decKingaku[0, 6]      = outDataAll.Select(gokei => gokei.zenUriage7).Sum();
                    decKingaku[0, 7]      = outDataAll.Select(gokei => gokei.zenUriage8).Sum();
                    decKingaku[0, 8]      = outDataAll.Select(gokei => gokei.zenUriage9).Sum();
                    decKingaku[0, 9]      = outDataAll.Select(gokei => gokei.zenUriage10).Sum();
                    decKingaku[0, 10]     = outDataAll.Select(gokei => gokei.zenUriage11).Sum();
                    decKingaku[0, 11]     = outDataAll.Select(gokei => gokei.zenUriage12).Sum();
                    decKingaku[0, 12]     = outDataAll.Select(gokei => gokei.zenUriageGoukei).Sum();
                    decKingaku[1, 0]      = outDataAll.Select(gokei => gokei.honUriage1).Sum();
                    decKingaku[1, 1]      = outDataAll.Select(gokei => gokei.honUriage2).Sum();
                    decKingaku[1, 2]      = outDataAll.Select(gokei => gokei.honUriage3).Sum();
                    decKingaku[1, 3]      = outDataAll.Select(gokei => gokei.honUriage4).Sum();
                    decKingaku[1, 4]      = outDataAll.Select(gokei => gokei.honUriage5).Sum();
                    decKingaku[1, 5]      = outDataAll.Select(gokei => gokei.honUriage6).Sum();
                    decKingaku[1, 6]      = outDataAll.Select(gokei => gokei.honUriage7).Sum();
                    decKingaku[1, 7]      = outDataAll.Select(gokei => gokei.honUriage8).Sum();
                    decKingaku[1, 8]      = outDataAll.Select(gokei => gokei.honUriage9).Sum();
                    decKingaku[1, 9]      = outDataAll.Select(gokei => gokei.honUriage10).Sum();
                    decKingaku[1, 10]     = outDataAll.Select(gokei => gokei.honUriage11).Sum();
                    decKingaku[1, 11]     = outDataAll.Select(gokei => gokei.honUriage12).Sum();
                    decKingaku[1, 12]     = outDataAll.Select(gokei => gokei.honUriageGoukei).Sum();

                    // 担当者計
                    var tantoGoukei = from tbl in dtSuiihyo.AsEnumerable()
                                      group tbl by tbl.Field <string>("担当者コード") into g
                                      select new
                    {
                        section         = g.Key,
                        count           = g.Count(),
                        zenUriage1      = g.Sum(p => p.Field <decimal>("前売上1")),
                        zenUriage2      = g.Sum(p => p.Field <decimal>("前売上2")),
                        zenUriage3      = g.Sum(p => p.Field <decimal>("前売上3")),
                        zenUriage4      = g.Sum(p => p.Field <decimal>("前売上4")),
                        zenUriage5      = g.Sum(p => p.Field <decimal>("前売上5")),
                        zenUriage6      = g.Sum(p => p.Field <decimal>("前売上6")),
                        zenUriage7      = g.Sum(p => p.Field <decimal>("前売上7")),
                        zenUriage8      = g.Sum(p => p.Field <decimal>("前売上8")),
                        zenUriage9      = g.Sum(p => p.Field <decimal>("前売上9")),
                        zenUriage10     = g.Sum(p => p.Field <decimal>("前売上10")),
                        zenUriage11     = g.Sum(p => p.Field <decimal>("前売上11")),
                        zenUriage12     = g.Sum(p => p.Field <decimal>("前売上12")),
                        zenUriageGoukei = g.Sum(p => p.Field <decimal>("前売上合計")),
                        honUriage1      = g.Sum(p => p.Field <decimal>("本売上1")),
                        honUriage2      = g.Sum(p => p.Field <decimal>("本売上2")),
                        honUriage3      = g.Sum(p => p.Field <decimal>("本売上3")),
                        honUriage4      = g.Sum(p => p.Field <decimal>("本売上4")),
                        honUriage5      = g.Sum(p => p.Field <decimal>("本売上5")),
                        honUriage6      = g.Sum(p => p.Field <decimal>("本売上6")),
                        honUriage7      = g.Sum(p => p.Field <decimal>("本売上7")),
                        honUriage8      = g.Sum(p => p.Field <decimal>("本売上8")),
                        honUriage9      = g.Sum(p => p.Field <decimal>("本売上9")),
                        honUriage10     = g.Sum(p => p.Field <decimal>("本売上10")),
                        honUriage11     = g.Sum(p => p.Field <decimal>("本売上11")),
                        honUriage12     = g.Sum(p => p.Field <decimal>("本売上12")),
                        honUriageGoukei = g.Sum(p => p.Field <decimal>("本売上合計"))
                    };

                    // 担当者計の前売上1~前売上12、前売上合計、本売上1~本売上12、本売上合計の合計算出
                    decimal[,,] decKingakuTanto = new decimal[tantoGoukei.Count(), 2, 13];
                    for (int cnt = 0; cnt < tantoGoukei.Count(); cnt++)
                    {
                        decKingakuTanto[cnt, 0, 0]  = tantoGoukei.ElementAt(cnt).zenUriage1;
                        decKingakuTanto[cnt, 0, 1]  = tantoGoukei.ElementAt(cnt).zenUriage2;
                        decKingakuTanto[cnt, 0, 2]  = tantoGoukei.ElementAt(cnt).zenUriage3;
                        decKingakuTanto[cnt, 0, 3]  = tantoGoukei.ElementAt(cnt).zenUriage4;
                        decKingakuTanto[cnt, 0, 4]  = tantoGoukei.ElementAt(cnt).zenUriage5;
                        decKingakuTanto[cnt, 0, 5]  = tantoGoukei.ElementAt(cnt).zenUriage6;
                        decKingakuTanto[cnt, 0, 6]  = tantoGoukei.ElementAt(cnt).zenUriage7;
                        decKingakuTanto[cnt, 0, 7]  = tantoGoukei.ElementAt(cnt).zenUriage8;
                        decKingakuTanto[cnt, 0, 8]  = tantoGoukei.ElementAt(cnt).zenUriage9;
                        decKingakuTanto[cnt, 0, 9]  = tantoGoukei.ElementAt(cnt).zenUriage10;
                        decKingakuTanto[cnt, 0, 10] = tantoGoukei.ElementAt(cnt).zenUriage11;
                        decKingakuTanto[cnt, 0, 11] = tantoGoukei.ElementAt(cnt).zenUriage12;
                        decKingakuTanto[cnt, 0, 12] = tantoGoukei.ElementAt(cnt).zenUriageGoukei;
                        decKingakuTanto[cnt, 1, 0]  = tantoGoukei.ElementAt(cnt).honUriage1;
                        decKingakuTanto[cnt, 1, 1]  = tantoGoukei.ElementAt(cnt).honUriage2;
                        decKingakuTanto[cnt, 1, 2]  = tantoGoukei.ElementAt(cnt).honUriage3;
                        decKingakuTanto[cnt, 1, 3]  = tantoGoukei.ElementAt(cnt).honUriage4;
                        decKingakuTanto[cnt, 1, 4]  = tantoGoukei.ElementAt(cnt).honUriage5;
                        decKingakuTanto[cnt, 1, 5]  = tantoGoukei.ElementAt(cnt).honUriage6;
                        decKingakuTanto[cnt, 1, 6]  = tantoGoukei.ElementAt(cnt).honUriage7;
                        decKingakuTanto[cnt, 1, 7]  = tantoGoukei.ElementAt(cnt).honUriage8;
                        decKingakuTanto[cnt, 1, 8]  = tantoGoukei.ElementAt(cnt).honUriage9;
                        decKingakuTanto[cnt, 1, 9]  = tantoGoukei.ElementAt(cnt).honUriage10;
                        decKingakuTanto[cnt, 1, 10] = tantoGoukei.ElementAt(cnt).honUriage11;
                        decKingakuTanto[cnt, 1, 11] = tantoGoukei.ElementAt(cnt).honUriage12;
                        decKingakuTanto[cnt, 1, 12] = tantoGoukei.ElementAt(cnt).honUriageGoukei;
                    }

                    // リストをデータテーブルに変換
                    DataTable dtChkList = pdf.ConvertToDataTable(outDataAll);

                    int maxRowCnt = (dtChkList.Rows.Count + tantoGoukei.Count() + 1) * 3;
                    int maxColCnt = dtChkList.Columns.Count;
                    int pageCnt   = 0; // ページ(シート枚数)カウント
                    int rowCnt    = 1; // datatable処理行カウント
                    int xlsRowCnt = 4; // Excel出力行カウント(開始は出力行)
                    maxPage = 0;       // 最大ページ数

                    // ページ数計算
                    double page        = 1.0 * maxRowCnt / 33;
                    double decimalpart = page % 1;
                    if (decimalpart != 0)
                    {
                        // 小数点以下が0でない場合、+1
                        maxPage = (int)Math.Floor(page) + 1;
                    }
                    else
                    {
                        maxPage = (int)page;
                    }

                    // 期間の月数を計算
                    int intMonthFrom = int.Parse(lstItem[0].Substring(5, 2));
                    int intMonthTo   = int.Parse(lstItem[1].Substring(5, 2));
                    if (intMonthFrom > intMonthTo)
                    {
                        intMonthTo += 12;
                    }
                    int intMonthDiff = intMonthTo - intMonthFrom;

                    Boolean blnDiff = false;

                    // 最後のリストに格納されているデータテーブルの場合、かつ、期間の開始から終了までの差が11カ月未満の場合
                    if (listCnt + 1 == lstDtSuiihyo.Count && intMonthDiff < 11)
                    {
                        blnDiff = true;
                    }

                    if (blnDiff)
                    {
                        // 担当者計の処理
                        for (int cnt = 0; cnt < tantoGoukei.Count(); cnt++)
                        {
                            decKingakuTanto[cnt, 0, 12] = 0;
                            decKingakuTanto[cnt, 1, 12] = 0;
                            for (int column = 0; column < 12; column++)
                            {
                                // 期間終了月の翌月以降の場合、0をセット
                                if (intMonthDiff < column)
                                {
                                    decKingakuTanto[cnt, 0, column] = 0;
                                    decKingakuTanto[cnt, 1, column] = 0;
                                }
                                else
                                {
                                    decKingakuTanto[cnt, 0, 12] += decKingakuTanto[cnt, 0, column];
                                    decKingakuTanto[cnt, 1, 12] += decKingakuTanto[cnt, 1, column];
                                }
                            }
                        }

                        // 合計の処理
                        decKingaku[0, 12] = 0;
                        decKingaku[1, 12] = 0;
                        for (int column = 0; column < 12; column++)
                        {
                            // 期間終了月の翌月以降の場合、0をセット
                            if (intMonthDiff < column)
                            {
                                decKingaku[0, column] = 0;
                                decKingaku[1, column] = 0;
                            }
                            else
                            {
                                decKingaku[0, 12] += decKingaku[0, column];
                                decKingaku[1, 12] += decKingaku[1, column];
                            }
                        }
                    }

                    int tantoCnt    = 0;
                    int tantoRowCnt = 0;

                    // ClosedXMLで1行ずつExcelに出力
                    foreach (DataRow drSuiihyo in dtChkList.Rows)
                    {
                        // 1ページ目のシート作成
                        if (rowCnt == 1)
                        {
                            DateTime dtYmdFrom = DateTime.Parse(lstItem[0]);
                            pageCnt++;

                            // Headerページのみの場合
                            if (workbook.Worksheets.Count == 1)
                            {
                                // タイトル出力(中央揃え、セル結合)
                                IXLCell titleCell = headersheet.Cell("A1");

                                // 出力先の選択が得意先別売上推移表の場合
                                if (lstItem[7].Equals("0"))
                                {
                                    titleCell.Value = "得意先別売上推移表";
                                }
                                else
                                {
                                    titleCell.Value = "得意先別粗利推移表";
                                }
                                titleCell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                                titleCell.Style.Font.FontSize        = 14;
                                headersheet.Range("A1", "P1").Merge();

                                // 単位出力(P2のセル、右揃え)
                                IXLCell unitCell = headersheet.Cell("P2");
                                unitCell.Value = "(単位:千円)";
                                unitCell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;

                                // ヘッダー出力(3行目のセル)
                                headersheet.Cell("A3").Value = "コード";
                                headersheet.Cell("B3").Value = "得意先名";
                                headersheet.Range("B3", "C3").Merge();
                                headersheet.Cell("D3").Value = dtYmdFrom.AddMonths(0);
                                headersheet.Cell("E3").Value = dtYmdFrom.AddMonths(1);
                                headersheet.Cell("F3").Value = dtYmdFrom.AddMonths(2);
                                headersheet.Cell("G3").Value = dtYmdFrom.AddMonths(3);
                                headersheet.Cell("H3").Value = dtYmdFrom.AddMonths(4);
                                headersheet.Cell("I3").Value = dtYmdFrom.AddMonths(5);
                                headersheet.Cell("J3").Value = dtYmdFrom.AddMonths(6);
                                headersheet.Cell("K3").Value = dtYmdFrom.AddMonths(7);
                                headersheet.Cell("L3").Value = dtYmdFrom.AddMonths(8);
                                headersheet.Cell("M3").Value = dtYmdFrom.AddMonths(9);
                                headersheet.Cell("N3").Value = dtYmdFrom.AddMonths(10);
                                headersheet.Cell("O3").Value = dtYmdFrom.AddMonths(11);
                                headersheet.Cell("P3").Value = "合計";

                                // 各月
                                headersheet.Cell("D3").Style.DateFormat.Format        = "yyyy年M月";
                                headersheet.Range("E3", "O3").Style.DateFormat.Format = "M月";

                                // ヘッダー列
                                headersheet.Range("A3", "P3").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;

                                // セルの周囲に罫線を引く
                                headersheet.Range("A3", "P3").Style
                                .Border.SetTopBorder(XLBorderStyleValues.Thin)
                                .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                                .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                                .Border.SetRightBorder(XLBorderStyleValues.Thin);

                                // 列幅の指定
                                headersheet.Column(1).Width = 6;
                                headersheet.Column(2).Width = 28;
                                headersheet.Column(3).Width = 6;
                                for (int cnt = 4; cnt < 15; cnt++)
                                {
                                    headersheet.Column(cnt).Width = 9;
                                }
                                headersheet.Column(16).Width = 10;

                                // 印刷体裁(B4横、印刷範囲)
                                headersheet.PageSetup.PaperSize       = XLPaperSize.B4Paper;
                                headersheet.PageSetup.PageOrientation = XLPageOrientation.Landscape;

                                // ヘッダー部の指定(番号)
                                headersheet.PageSetup.Header.Left.AddText("(№53)");

                                // ヘッダーシートのコピー
                                pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                            }
                            else
                            {
                                // 開始年を変更
                                dtYmdFrom = DateTime.Parse(lstItem[0]);
                                headersheet.Cell("D3").Value = dtYmdFrom.AddYears(listCnt);

                                // ヘッダーシートのコピー
                                pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                            }
                        }

                        // 得意先コードを出力
                        currentsheet.Cell(xlsRowCnt, 1).Value = drSuiihyo[2].ToString();
                        currentsheet.Cell(xlsRowCnt, 1).Style.Alignment.Vertical = XLAlignmentVerticalValues.Top;

                        // 得意先名を出力
                        currentsheet.Cell(xlsRowCnt, 2).Value = drSuiihyo[3].ToString();
                        currentsheet.Cell(xlsRowCnt, 2).Style.Alignment.Vertical = XLAlignmentVerticalValues.Top;
                        currentsheet.Cell(xlsRowCnt, 2).Style.Alignment.WrapText = true;

                        // セルの結合
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt + 2, 1).Merge();
                        currentsheet.Range(xlsRowCnt, 2, xlsRowCnt + 2, 2).Merge();

                        // 行タイトル(前年、本年、達成率)を出力
                        currentsheet.Cell(xlsRowCnt, 3).Value     = "前年";
                        currentsheet.Cell(xlsRowCnt + 1, 3).Value = "本年";
                        currentsheet.Cell(xlsRowCnt + 2, 3).Value = "達成率";

                        // 期間の開始から終了までの差が11カ月未満の場合
                        if (blnDiff)
                        {
                            drSuiihyo[16] = 0;
                            drSuiihyo[29] = 0;
                        }

                        // 1セルずつデータ出力
                        for (int colCnt = 1; colCnt <= maxColCnt; colCnt++)
                        {
                            string str = drSuiihyo[colCnt - 1].ToString();

                            // 前売上1~12セルの処理
                            if (colCnt >= 5 && colCnt <= 16)
                            {
                                // 3桁毎に","を挿入する
                                currentsheet.Cell(xlsRowCnt, colCnt - 1).Style.NumberFormat.SetFormat("#,##0");
                                currentsheet.Cell(xlsRowCnt, colCnt - 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;

                                // 期間終了月の翌月以降の場合、0をセット
                                if (blnDiff && intMonthDiff < (colCnt - 5))
                                {
                                    currentsheet.Cell(xlsRowCnt, colCnt - 1).Value = 0;
                                }
                                else
                                {
                                    currentsheet.Cell(xlsRowCnt, colCnt - 1).Value = str;

                                    // 期間の開始から終了までの差が11カ月未満の場合
                                    if (blnDiff)
                                    {
                                        drSuiihyo[16] = (decimal)drSuiihyo[16] + (decimal)drSuiihyo[colCnt - 1];
                                    }
                                }
                            }

                            // 前売上合計セルの処理
                            if (colCnt == 17)
                            {
                                // 3桁毎に","を挿入する
                                currentsheet.Cell(xlsRowCnt, colCnt - 1).Style.NumberFormat.SetFormat("#,##0");
                                currentsheet.Cell(xlsRowCnt, colCnt - 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                currentsheet.Cell(xlsRowCnt, colCnt - 1).Value = str;
                            }

                            // 本売上1~12セルの処理
                            if (colCnt >= 18 && colCnt <= 29)
                            {
                                // 3桁毎に","を挿入する
                                currentsheet.Cell(xlsRowCnt + 1, colCnt - 14).Style.NumberFormat.SetFormat("#,##0");
                                currentsheet.Cell(xlsRowCnt + 1, colCnt - 14).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;

                                // 期間終了月の翌月以降の場合、0をセット
                                if (blnDiff && intMonthDiff < (colCnt - 18))
                                {
                                    currentsheet.Cell(xlsRowCnt + 1, colCnt - 14).Value = 0;
                                }
                                else
                                {
                                    currentsheet.Cell(xlsRowCnt + 1, colCnt - 14).Value = str;

                                    // 期間の開始から終了までの差が11カ月未満の場合
                                    if (blnDiff)
                                    {
                                        drSuiihyo[29] = (decimal)drSuiihyo[29] + (decimal)drSuiihyo[colCnt - 1];
                                    }
                                }
                            }

                            // 本売上合計セルの処理
                            if (colCnt == 30)
                            {
                                // 3桁毎に","を挿入する
                                currentsheet.Cell(xlsRowCnt + 1, colCnt - 14).Style.NumberFormat.SetFormat("#,##0");
                                currentsheet.Cell(xlsRowCnt + 1, colCnt - 14).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                currentsheet.Cell(xlsRowCnt + 1, colCnt - 14).Value = str;
                            }
                        }

                        // 達成率の計算、出力
                        for (int column = 0; column < 12; column++)
                        {
                            decimal decZennen = 0;
                            decimal decHonnen = 0;
                            double  dblRitsu;

                            for (int cnt = 0; cnt <= column; cnt++)
                            {
                                // 期間の開始から終了までの差が11カ月未満でない場合、or
                                // 期間の開始から終了までの差が11カ月未満の場合、かつ、月数の差が列数以下の場合
                                if (!blnDiff || blnDiff && intMonthDiff >= column)
                                {
                                    decZennen += decimal.Parse(drSuiihyo[cnt + 4].ToString());
                                    decHonnen += decimal.Parse(drSuiihyo[cnt + 17].ToString());
                                }
                            }

                            if (decZennen == 0 || decHonnen == 0)
                            {
                                dblRitsu = 0;
                            }
                            else
                            {
                                dblRitsu = ((double)decHonnen / (double)decZennen) * 100;
                            }

                            // 3桁毎に","を挿入する、小数点第2位まで
                            currentsheet.Cell(xlsRowCnt + 2, column + 4).Style.NumberFormat.SetFormat("#,##0.00");
                            currentsheet.Cell(xlsRowCnt + 2, column + 4).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                            currentsheet.Cell(xlsRowCnt + 2, column + 4).Value = dblRitsu.ToString();
                        }

                        // 達成率の合計出力
                        // 3桁毎に","を挿入する、小数点第2位まで
                        currentsheet.Cell(xlsRowCnt + 2, 16).Style.NumberFormat.SetFormat("#,##0.00");
                        currentsheet.Cell(xlsRowCnt + 2, 16).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                        currentsheet.Cell(xlsRowCnt + 2, 16).Value = currentsheet.Cell(xlsRowCnt + 2, intMonthDiff + 4).Value;

                        // 3行分のセルの周囲に罫線を引く
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt + 2, 16).Style
                        .Border.SetTopBorder(XLBorderStyleValues.Thin)
                        .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                        .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                        .Border.SetRightBorder(XLBorderStyleValues.Thin);

                        // 33行毎(ヘッダーを除いた行数)にシート作成
                        if (xlsRowCnt == 37)
                        {
                            pageCnt++;
                            if (pageCnt <= maxPage)
                            {
                                xlsRowCnt = 1;

                                // ヘッダーシートのコピー
                                pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                            }
                        }

                        // 担当者計を出力
                        tantoRowCnt++;
                        if (tantoGoukei.ElementAt(tantoCnt).count == tantoRowCnt)
                        {
                            xlsRowCnt += 3;

                            // 縦中央
                            IXLCell tantocell = currentsheet.Cell(xlsRowCnt, 1);
                            tantocell.Value = drSuiihyo[1].ToString();
                            tantocell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

                            // セル結合、セルの背景色
                            IXLRange tantorange = currentsheet.Range(xlsRowCnt, 1, xlsRowCnt + 2, 2);
                            tantorange.Merge();
                            tantorange.Style.Fill.BackgroundColor = XLColor.LightGray;

                            // 行タイトル(前年、本年、達成率)を出力
                            currentsheet.Cell(xlsRowCnt, 3).Value     = "前年";
                            currentsheet.Cell(xlsRowCnt + 1, 3).Value = "本年";
                            currentsheet.Cell(xlsRowCnt + 2, 3).Value = "達成率";

                            // 前年、本年、達成率セルの処理
                            for (int column = 0; column < 13; column++)
                            {
                                // 前年と本年を出力
                                for (int cnt = 0; cnt < 2; cnt++)
                                {
                                    // 3桁毎に","を挿入する
                                    IXLCell kingakuCell = currentsheet.Cell(xlsRowCnt + cnt, column + 4);
                                    kingakuCell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                    kingakuCell.Style.NumberFormat.SetFormat("#,##0");
                                    kingakuCell.Value = decKingakuTanto[tantoCnt, cnt, column].ToString();
                                }

                                // 達成率の計算、出力
                                double dblRitsu;

                                if (decKingakuTanto[tantoCnt, 0, column] == 0 || decKingakuTanto[tantoCnt, 1, column] == 0)
                                {
                                    dblRitsu = 0;
                                }
                                else
                                {
                                    dblRitsu = ((double)decKingakuTanto[tantoCnt, 1, column] / (double)decKingakuTanto[tantoCnt, 0, column]) * 100;
                                }

                                // 3桁毎に","を挿入する、小数点第2位まで
                                currentsheet.Cell(xlsRowCnt + 2, column + 4).Style.NumberFormat.SetFormat("#,##0.00");
                                currentsheet.Cell(xlsRowCnt + 2, column + 4).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                currentsheet.Cell(xlsRowCnt + 2, column + 4).Value = dblRitsu.ToString();
                            }

                            // 3行分のセルの周囲に罫線を引く
                            currentsheet.Range(xlsRowCnt, 1, xlsRowCnt + 2, 16).Style
                            .Border.SetTopBorder(XLBorderStyleValues.Thin)
                            .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                            .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                            .Border.SetRightBorder(XLBorderStyleValues.Thin);

                            tantoCnt++;
                            tantoRowCnt = 0;
                        }

                        // 33行毎(ヘッダーを除いた行数)にシート作成
                        if (xlsRowCnt == 37)
                        {
                            pageCnt++;
                            if (pageCnt <= maxPage)
                            {
                                xlsRowCnt = 1;

                                // ヘッダーシートのコピー
                                pdf.sheetCopy(ref workbook, ref headersheet, ref currentsheet, workbook.Worksheets.Count);
                            }
                        }

                        rowCnt++;
                        xlsRowCnt += 3;
                    }

                    // 最終行を出力した後、合計行を出力
                    if (dtChkList.Rows.Count > 0)
                    {
                        // 前年と本年の合計を出力
                        for (int row = 0; row < 2; row++)
                        {
                            for (int column = 0; column < 13; column++)
                            {
                                // 3桁毎に","を挿入する
                                IXLCell kingakuCell = currentsheet.Cell(xlsRowCnt + row, 4 + column);
                                kingakuCell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                kingakuCell.Style.NumberFormat.SetFormat("#,##0");
                                kingakuCell.Value = decKingaku[row, column].ToString();
                            }
                        }

                        // 合計タイトルを出力
                        currentsheet.Cell(xlsRowCnt, 1).Value = "■■ 合  計 ■■";
                        currentsheet.Cell(xlsRowCnt, 1).Style.Alignment.Vertical   = XLAlignmentVerticalValues.Center;
                        currentsheet.Cell(xlsRowCnt, 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;

                        // セルの結合
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt + 2, 2).Merge();

                        // 行タイトル(前年、本年、達成率)を出力
                        currentsheet.Cell(xlsRowCnt, 3).Value     = "前年";
                        currentsheet.Cell(xlsRowCnt + 1, 3).Value = "本年";
                        currentsheet.Cell(xlsRowCnt + 2, 3).Value = "達成率";

                        // 達成率の計算、出力
                        for (int column = 0; column < 13; column++)
                        {
                            double dblRitsu;

                            if (decKingaku[0, column] == 0 || decKingaku[1, column] == 0)
                            {
                                dblRitsu = 0;
                            }
                            else
                            {
                                dblRitsu = ((double)decKingaku[1, column] / (double)decKingaku[0, column]) * 100;
                            }

                            // 3桁毎に","を挿入する、小数点第2位まで
                            currentsheet.Cell(xlsRowCnt + 2, column + 4).Style.NumberFormat.SetFormat("#,##0.00");
                            currentsheet.Cell(xlsRowCnt + 2, column + 4).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                            currentsheet.Cell(xlsRowCnt + 2, column + 4).Value = dblRitsu.ToString();
                        }

                        // 3行分のセルの周囲に罫線を引く
                        currentsheet.Range(xlsRowCnt, 1, xlsRowCnt + 2, 16).Style
                        .Border.SetTopBorder(XLBorderStyleValues.Thin)
                        .Border.SetBottomBorder(XLBorderStyleValues.Thin)
                        .Border.SetLeftBorder(XLBorderStyleValues.Thin)
                        .Border.SetRightBorder(XLBorderStyleValues.Thin);
                    }
                }

                // ヘッダーシート削除
                headersheet.Delete();

                // 各ページのヘッダー部を指定
                maxPage = workbook.Worksheets.Count;
                for (int pageCnt = 1; pageCnt <= maxPage; pageCnt++)
                {
                    // ヘッダー部に指定する情報を取得
                    string strHeader = pdf.getHeader(pageCnt, maxPage, strNow);

                    // ヘッダー部の指定(コンピュータ名、日付、ページ数を出力)
                    workbook.Worksheet(pageCnt).PageSetup.Header.Right.AddText(strHeader);
                }

                // workbookを保存
                string strOutXlsFile = strWorkPath + strDateTime + ".xlsx";
                workbook.SaveAs(strOutXlsFile);

                // workbookを解放
                workbook.Dispose();

                // PDF化の処理
                return(pdf.createPdf(strOutXlsFile, strDateTime, 1));
            }
            catch
            {
                throw;
            }
            finally
            {
                // Workフォルダの全ファイルを取得
                string[] files = System.IO.Directory.GetFiles(strWorkPath, "*", System.IO.SearchOption.AllDirectories);
                // Workフォルダ内のファイル削除
                foreach (string filepath in files)
                {
                    //File.Delete(filepath);
                }
            }
        }