diff --git a/Controllers/ApiController.cs b/Controllers/ApiController.cs index a6581c89..70fffdbf 100644 --- a/Controllers/ApiController.cs +++ b/Controllers/ApiController.cs @@ -19,6 +19,8 @@ using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; using System.Text; using System.Web; +using NPOI.SS.Util; +using NPOI.XSSF.Streaming; namespace QuotationMaker.Controllers { @@ -154,6 +156,51 @@ namespace QuotationMaker.Controllers row = (XSSFRow)sheet.GetRow(20); row.Cells[0].SetCellValue(quotation_grandTotalStr); + //簽章欄 + row = (XSSFRow)sheet.GetRow(27); + row.Cells[0].SetCellValue(row.Cells[0].StringCellValue.Replace("{user_name}", objDetail.user.user_name)); + + //匯款項目與發票 + int payment_count = objDetail.payments.Count; + int invoice_count = objDetail.invoices.Count; + int real_count = 0; + + if (payment_count > invoice_count) + { + real_count = payment_count; + } + else { + real_count = invoice_count; + } + + for (int i = 1; i <= real_count; i++) { + int rowIndex = 20 + i; + CopyRow((XSSFWorkbook)workbook, (XSSFSheet)sheet, rowIndex, rowIndex + 1); + + if (i <= objDetail.payments.Count) { + //付款方式 + row = (XSSFRow)sheet.GetRow(rowIndex); + + string paymentStr = objDetail.payments[i - 1].payment_methodname; + + if (objDetail.payments[i - 1].payment_descript != "") { + paymentStr += "; " + objDetail.payments[i - 1].payment_descript; + } + + row.Cells[0].SetCellValue(paymentStr); + } + + if (i <= objDetail.invoices.Count) { + //發票 + row = (XSSFRow)sheet.GetRow(rowIndex); + + row.Cells[3].SetCellValue(objDetail.invoices[i - 1].invoice_name); + row.Cells[4].SetCellValue(objDetail.invoices[i - 1].invoice_year.ToString() + "/" + objDetail.invoices[i - 1].invoice_month.ToString().PadLeft(2, '0')); + row.Cells[6].SetCellValue("$NT" + objDetail.invoices[i - 1].invoice_noTaxMoney.ToString("###,###")); + } + } + + MemoryStream ms = new MemoryStream(); workbook.Write(ms); ms.Flush(); @@ -180,6 +227,111 @@ namespace QuotationMaker.Controllers return Content(JsonConvert.SerializeObject(ret), "application/json;charset=utf-8"); } + + + + + /// + + /// HSSFRow Copy Command + /// + /// Description: Inserts a existing row into a new row, will automatically push down + /// any existing rows. Copy is done cell by cell and supports, and the + /// command tries to copy all properties available (style, merged cells, values, etc...) + /// + + private void CopyRow(XSSFWorkbook workbook, XSSFSheet worksheet, int sourceRowNum, int destinationRowNum) + { + // Get the source / new row + XSSFRow newRow = (XSSFRow)worksheet.GetRow(destinationRowNum); + XSSFRow sourceRow = (XSSFRow)worksheet.GetRow(sourceRowNum); + + // If the row exist in destination, push down all rows by 1 else create a new row + if (newRow != null) + { + worksheet.ShiftRows(destinationRowNum, worksheet.LastRowNum, 1); + + newRow = (XSSFRow)worksheet.CreateRow(destinationRowNum); + newRow.Height = sourceRow.Height; + } + else + { + newRow = (XSSFRow)worksheet.CreateRow(destinationRowNum); + } + + // Loop through source columns to add to new row + for (int i = 0; i < sourceRow.LastCellNum; i++) + { + // Grab a copy of the old/new cell + XSSFCell oldCell = (XSSFCell)sourceRow.GetCell(i); + XSSFCell newCell = (XSSFCell)newRow.CreateCell(i); + + // If the old cell is null jump to next cell + if (oldCell == null) + { + newCell = null; + continue; + } + + // Copy style from old cell and apply to new cell + XSSFCellStyle newCellStyle = (XSSFCellStyle)workbook.CreateCellStyle(); + newCellStyle.CloneStyleFrom(oldCell.CellStyle); ; + newCell.CellStyle = newCellStyle; + + // If there is a cell comment, copy + if (newCell.CellComment != null) newCell.CellComment = oldCell.CellComment; + + // If there is a cell hyperlink, copy + if (oldCell.Hyperlink != null) newCell.Hyperlink = oldCell.Hyperlink; + + // Set the cell data type + newCell.SetCellType(oldCell.CellType); + + // Set the cell data value + switch (oldCell.CellType) + { + case CellType.Blank: + newCell.SetCellValue(oldCell.StringCellValue); + break; + case CellType.Boolean: + newCell.SetCellValue(oldCell.BooleanCellValue); + break; + case CellType.Error: + newCell.SetCellErrorValue(oldCell.ErrorCellValue); + break; + case CellType.Formula: + newCell.SetCellFormula(oldCell.CellFormula); + break; + case CellType.Numeric: + newCell.SetCellValue(oldCell.NumericCellValue); + break; + case CellType.String: + newCell.SetCellValue(oldCell.RichStringCellValue); + break; + case CellType.Unknown: + newCell.SetCellValue(oldCell.StringCellValue); + break; + } + } + + // If there are are any merged regions in the source row, copy to new row + for (int i = 0; i < worksheet.NumMergedRegions; i++) + { + CellRangeAddress cellRangeAddress = worksheet.GetMergedRegion(i); + if (cellRangeAddress.FirstRow == sourceRow.RowNum) + { + CellRangeAddress newCellRangeAddress = new CellRangeAddress(newRow.RowNum, + (newRow.RowNum + + (cellRangeAddress.FirstRow - + cellRangeAddress.LastRow)), + cellRangeAddress.FirstColumn, + cellRangeAddress.LastColumn); + worksheet.AddMergedRegion(newCellRangeAddress); + } + } + + } + [Route("saveas")] public ActionResult SaveAs(IFormCollection obj) { saveasResult ret = new saveasResult(); diff --git a/Modals/GlobalClass.cs b/Modals/GlobalClass.cs index 85dfc6b1..cd4c3068 100644 --- a/Modals/GlobalClass.cs +++ b/Modals/GlobalClass.cs @@ -415,3 +415,5 @@ public class ChtNumConverter return (negtive ? "負" : string.Empty) + t; } } + + diff --git a/wwwroot/logo/bremen_temp.xlsx b/wwwroot/logo/bremen_temp.xlsx index c37458f9..be2982b7 100644 Binary files a/wwwroot/logo/bremen_temp.xlsx and b/wwwroot/logo/bremen_temp.xlsx differ diff --git a/wwwroot/logo/journeys_temp.xlsx b/wwwroot/logo/journeys_temp.xlsx index 32d02f48..059ef472 100644 Binary files a/wwwroot/logo/journeys_temp.xlsx and b/wwwroot/logo/journeys_temp.xlsx differ