/// ----------------------------------------------------------------------------- /// <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); } } }
/// ----------------------------------------------------------------------------- /// <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); } } }