Commit df4d48b3fe074208bc2234e27d5dd8ff22c175aa

Authored by 徐烜
1 parent 96c63262

时刻表v2.7.10

1、修改fnCalcuOtherBc方法,如果最后一班次是吃饭班次需要删除
2、修改重新生成页面,添加主站副站参数
3、修改后台动态时刻表导出功能,可以导出Excel97 xls和Excel2007 xlsx两个版本的excel文件
src/main/java/com/bsth/controller/schedule/core/TTInfoDetailController.java
... ... @@ -8,6 +8,7 @@ import com.bsth.service.schedule.datatools.TTInfoDetailForEdit;
8 8 import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
9 9 import com.bsth.service.schedule.timetable.ExcelFormatType;
10 10 import com.bsth.service.schedule.utils.DataToolsFile;
  11 +import com.bsth.service.schedule.utils.DataToolsFileType;
11 12 import org.springframework.beans.factory.annotation.Autowired;
12 13 import org.springframework.web.bind.annotation.*;
13 14  
... ... @@ -128,11 +129,19 @@ public class TTInfoDetailController extends BController<TTInfoDetail, Long> {
128 129 }
129 130  
130 131  
131   - @RequestMapping(value = "/exportDTDFile", method = RequestMethod.POST)
  132 + @RequestMapping(value = "/exportDTDFile/{type}", method = RequestMethod.POST)
132 133 public void exportFile(
133   - @RequestBody TTinfoDetailDynamicData.DTInfos dtInfos,
  134 + @RequestBody TTinfoDetailDynamicData.DTInfos dtInfos, @PathVariable("type") String type,
134 135 HttpServletResponse response) throws Exception {
135   - DataToolsFile dataToolsFile = ttInfoDetailService.exportDynamicTTinfo(dtInfos);
  136 + DataToolsFile dataToolsFile = null;
  137 + if ("xls".equals(type)) {
  138 + dataToolsFile = ttInfoDetailService.exportDynamicTTinfo(dtInfos, DataToolsFileType.XLS);
  139 + } else if ("xlsx".equals(type)) {
  140 + dataToolsFile = ttInfoDetailService.exportDynamicTTinfo(dtInfos, DataToolsFileType.XLSX);
  141 + } else {
  142 + throw new Exception("未知的导出格式==>" + type);
  143 + }
  144 +
136 145 // 流输出导出文件
137 146 response.setHeader("content-type", "application/octet-stream");
138 147 response.setHeader("Content-Disposition", "attachment; filename=" + dataToolsFile.getFile().getName());
... ...
src/main/java/com/bsth/service/schedule/TTInfoDetailService.java
... ... @@ -6,6 +6,7 @@ import com.bsth.service.schedule.datatools.TTinfoDetailDynamicData;
6 6 import com.bsth.service.schedule.exception.ScheduleException;
7 7 import com.bsth.service.schedule.timetable.ExcelFormatType;
8 8 import com.bsth.service.schedule.utils.DataToolsFile;
  9 +import com.bsth.service.schedule.utils.DataToolsFileType;
9 10  
10 11 import java.util.List;
11 12 import java.util.Map;
... ... @@ -30,7 +31,7 @@ public interface TTInfoDetailService extends BService<TTInfoDetail, Long> {
30 31 * @return
31 32 * @throws ScheduleException
32 33 */
33   - DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos) throws ScheduleException;
  34 + DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos, DataToolsFileType type) throws ScheduleException;
34 35  
35 36 /**
36 37 * 获取时刻表最大发车顺序号
... ...
src/main/java/com/bsth/service/schedule/datatools/Excel2003PoiOperator.java 0 → 100644
  1 +package com.bsth.service.schedule.datatools;
  2 +
  3 +import org.apache.poi.hssf.usermodel.*;
  4 +import org.apache.poi.ss.usermodel.*;
  5 +import org.apache.poi.ss.util.WorkbookUtil;
  6 +import org.apache.poi.xssf.usermodel.XSSFColor;
  7 +
  8 +import java.awt.Color;
  9 +import java.io.File;
  10 +import java.io.FileOutputStream;
  11 +import java.util.Date;
  12 +
  13 +/**
  14 + * Excel2003表格Poi操作类。
  15 + * TODO:2003里面还有很多和2007不通的样式设定方式,以后再改
  16 + */
  17 +public class Excel2003PoiOperator implements ExcelPoiOperator {
  18 + @Override
  19 + public Cell createCell(
  20 + Workbook workbook, Row row, short columnIndex,
  21 + Object value, int valueType,
  22 + HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment,
  23 + BorderStyle borderStyle, Color borderColor,
  24 + short fontSize, Color fontColor, String fontName,
  25 + Color backgroudColor, FillPatternType fillPatternType) {
  26 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  27 + HSSFRow hssfRow = (HSSFRow) row;
  28 +
  29 + CreationHelper creationHelper = hssfWorkbook.getCreationHelper();
  30 +
  31 + // 1、创建单元格对象
  32 + HSSFCell hssfCell = hssfRow.createCell((int) columnIndex);
  33 +
  34 + // 2、设定样式
  35 + HSSFCellStyle hssfCellStyle = hssfWorkbook.createCellStyle();
  36 +
  37 + // 设定值及数据格式
  38 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  39 + if (valueType == HSSFCell.CELL_TYPE_STRING) {
  40 + hssfCellStyle.setDataFormat(dataFormat.getFormat("@"));
  41 + hssfCell.setCellValue(creationHelper.createRichTextString(String.valueOf(value)));
  42 + } else if (valueType == HSSFCell.CELL_TYPE_NUMERIC) {
  43 + if (value instanceof Date) { // 日期
  44 + hssfCellStyle.setDataFormat(dataFormat.getFormat("yyyy-mm-dd"));
  45 + hssfCell.setCellValue((Date) value);
  46 + } else if (value instanceof Double) {
  47 + hssfCellStyle.setDataFormat(dataFormat.getFormat("0.00"));
  48 + hssfCell.setCellValue((Double) value);
  49 + } else if (value instanceof Integer) {
  50 + hssfCellStyle.setDataFormat(dataFormat.getFormat("0"));
  51 + hssfCell.setCellValue(Double.valueOf(value.toString()));
  52 + } else {
  53 + throw new RuntimeException("Excel2003 只支持 String Date Double Integer 单元格类型");
  54 + }
  55 + } else if (valueType == HSSFCell.CELL_TYPE_BLANK) {
  56 + hssfCell.setCellType(HSSFCell.CELL_TYPE_BLANK);
  57 + } else {
  58 + throw new RuntimeException("暂时不支持字符串、日期、数字以外的类型");
  59 + }
  60 +
  61 + // 对齐方式
  62 + hssfCellStyle.setAlignment((short) horizontalAlignment.ordinal());
  63 + hssfCellStyle.setVerticalAlignment((short) verticalAlignment.ordinal());
  64 +
  65 + // 边框样式
  66 + hssfCellStyle.setBorderTop((short) borderStyle.ordinal());
  67 + hssfCellStyle.setTopBorderColor(new XSSFColor(borderColor).getIndexed());
  68 + hssfCellStyle.setBorderBottom((short) borderStyle.ordinal());
  69 + hssfCellStyle.setBottomBorderColor(new XSSFColor(borderColor).getIndexed());
  70 + hssfCellStyle.setBorderLeft((short) borderStyle.ordinal());
  71 + hssfCellStyle.setLeftBorderColor(new XSSFColor(borderColor).getIndexed());
  72 + hssfCellStyle.setBorderRight((short) borderStyle.ordinal());
  73 + hssfCellStyle.setRightBorderColor(new XSSFColor(borderColor).getIndexed());
  74 +
  75 + // 字体颜色
  76 +// HSSFFont font = hssfWorkbook.createFont();
  77 +// font.setColor(new XSSFColor(fontColor).getIndexed());
  78 +// font.setFontHeightInPoints(fontSize);
  79 +// font.setFontName(fontName);
  80 +// hssfCellStyle.setFont(font);
  81 +
  82 +
  83 + // 单元背景色
  84 + hssfCellStyle.setFillForegroundColor(new XSSFColor(backgroudColor).getIndexed());
  85 +// hssfCellStyle.setFillPattern((short) fillPatternType.ordinal());
  86 +
  87 + // TODO
  88 +
  89 + hssfCell.setCellStyle(hssfCellStyle);
  90 + return hssfCell;
  91 + }
  92 +
  93 + @Override
  94 + public Cell createStringCell(
  95 + Workbook workbook, Row row, short columnIndex,
  96 + String value) {
  97 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  98 + HSSFRow hssfRow = (HSSFRow) row;
  99 +
  100 + HSSFCell hssfCell = (HSSFCell) createCell(
  101 + hssfWorkbook, hssfRow, columnIndex,
  102 + value, HSSFCell.CELL_TYPE_STRING,
  103 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  104 + BorderStyle.MEDIUM, new java.awt.Color(0xdedede),
  105 + (short) 13, new java.awt.Color(0x2765A7), "宋体",
  106 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  107 + );
  108 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  109 + hssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("@"));
  110 + return hssfCell;
  111 + }
  112 +
  113 + @Override
  114 + public Cell createStringCell(
  115 + Workbook workbook, Row row, short columnIndex,
  116 + String value,
  117 + Color backgroudColor) {
  118 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  119 + HSSFRow hssfRow = (HSSFRow) row;
  120 +
  121 + HSSFCell hssfCell = (HSSFCell) createCell(
  122 + hssfWorkbook, hssfRow, columnIndex,
  123 + value, HSSFCell.CELL_TYPE_STRING,
  124 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  125 + BorderStyle.MEDIUM, new java.awt.Color(0xdedede),
  126 + (short) 13, new java.awt.Color(0x2765A7), "宋体",
  127 + backgroudColor, FillPatternType.SOLID_FOREGROUND
  128 + );
  129 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  130 + hssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("@"));
  131 + return hssfCell;
  132 + }
  133 +
  134 + @Override
  135 + public Cell createIntegerCell(
  136 + Workbook workbook, Row row, short columnIndex,
  137 + Integer value) {
  138 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  139 + HSSFRow hssfRow = (HSSFRow) row;
  140 +
  141 + HSSFCell hssfCell = (HSSFCell) createCell(
  142 + hssfWorkbook, hssfRow, columnIndex,
  143 + value, HSSFCell.CELL_TYPE_NUMERIC,
  144 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  145 + BorderStyle.MEDIUM, new Color(0xdedede),
  146 + (short) 13, new Color(0x2765A7), "宋体",
  147 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  148 + );
  149 +
  150 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  151 + hssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0"));
  152 + return hssfCell;
  153 + }
  154 +
  155 + @Override
  156 + public Cell createIntegerCell(
  157 + Workbook workbook, Row row, short columnIndex,
  158 + Integer value,
  159 + Color backgroudColor) {
  160 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  161 + HSSFRow hssfRow = (HSSFRow) row;
  162 +
  163 + HSSFCell hssfCell = (HSSFCell) createCell(
  164 + hssfWorkbook, hssfRow, columnIndex,
  165 + value, HSSFCell.CELL_TYPE_NUMERIC,
  166 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  167 + BorderStyle.MEDIUM, new Color(0xdedede),
  168 + (short) 13, new Color(0x2765A7), "宋体",
  169 + backgroudColor, FillPatternType.SOLID_FOREGROUND
  170 + );
  171 +
  172 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  173 + hssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0"));
  174 + return hssfCell;
  175 + }
  176 +
  177 + @Override
  178 + public Cell createDoubleCell(
  179 + Workbook workbook, Row row, short columnIndex,
  180 + Double value) {
  181 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  182 + HSSFRow hssfRow = (HSSFRow) row;
  183 +
  184 + HSSFCell hssfCell = (HSSFCell) createCell(
  185 + hssfWorkbook, hssfRow, columnIndex,
  186 + value, HSSFCell.CELL_TYPE_NUMERIC,
  187 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  188 + BorderStyle.MEDIUM, new Color(0xdedede),
  189 + (short) 13, new Color(0x2765A7), "宋体",
  190 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  191 + );
  192 +
  193 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  194 + hssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0.00"));
  195 + return hssfCell;
  196 + }
  197 +
  198 + @Override
  199 + public Cell createDoubleCell(
  200 + Workbook workbook, Row row, short columnIndex,
  201 + Double value,
  202 + Color backgroudColor) {
  203 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  204 + HSSFRow hssfRow = (HSSFRow) row;
  205 +
  206 + HSSFCell hssfCell = (HSSFCell) createCell(
  207 + hssfWorkbook, hssfRow, columnIndex,
  208 + value, HSSFCell.CELL_TYPE_NUMERIC,
  209 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  210 + BorderStyle.MEDIUM, new Color(0xdedede),
  211 + (short) 13, new Color(0x2765A7), "宋体",
  212 + backgroudColor, FillPatternType.SOLID_FOREGROUND
  213 + );
  214 +
  215 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  216 + hssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0.00"));
  217 + return hssfCell;
  218 + }
  219 +
  220 + @Override
  221 + public Cell createBlankCell(Workbook workbook, Row row, short columnIndex) {
  222 + return createCell(
  223 + workbook, row, columnIndex,
  224 + null, HSSFCell.CELL_TYPE_BLANK,
  225 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  226 + BorderStyle.MEDIUM, new Color(0xdedede),
  227 + (short) 13, new Color(0x2765A7), "宋体",
  228 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  229 + );
  230 + }
  231 +
  232 + @Override
  233 + public Cell setCellDataFormat(Workbook workbook, Cell cell, String fmt) {
  234 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  235 + DataFormat dataFormat = hssfWorkbook.createDataFormat();
  236 + cell.getCellStyle().setDataFormat(dataFormat.getFormat("fmt"));
  237 + return cell;
  238 + }
  239 +
  240 + @Override
  241 + public Cell setCellBackground(Cell cell, Color color) {
  242 + HSSFCell hssfCell = (HSSFCell) cell;
  243 + hssfCell.getCellStyle().setFillForegroundColor(new XSSFColor(color).getIndexed());
  244 + return cell;
  245 + }
  246 +
  247 + @Override
  248 + public Workbook createWorkBook() {
  249 + return new HSSFWorkbook();
  250 + }
  251 +
  252 + @Override
  253 + public Sheet createWorkBookSheet(Workbook workbook, String sheetName) {
  254 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  255 + return hssfWorkbook.createSheet(WorkbookUtil.createSafeSheetName(sheetName));
  256 + }
  257 +
  258 + @Override
  259 + public Row createSheetRow(Sheet sheet, int rowIndex) {
  260 + HSSFSheet hssfSheet = (HSSFSheet) sheet;
  261 + return hssfSheet.createRow(rowIndex);
  262 + }
  263 +
  264 + @Override
  265 + public void writeExcel(File excelFile, Workbook workbook) {
  266 + try {
  267 + HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
  268 + FileOutputStream fileOutputStream = new FileOutputStream(excelFile);
  269 + hssfWorkbook.write(fileOutputStream);
  270 + } catch (Exception exp) {
  271 + throw new RuntimeException(exp);
  272 + }
  273 + }
  274 +}
... ...
src/main/java/com/bsth/service/schedule/datatools/Excel2007PoiOperator.java 0 → 100644
  1 +package com.bsth.service.schedule.datatools;
  2 +
  3 +import org.apache.poi.ss.usermodel.*;
  4 +import org.apache.poi.ss.util.WorkbookUtil;
  5 +import org.apache.poi.xssf.usermodel.*;
  6 +
  7 +import java.awt.Color;
  8 +import java.io.File;
  9 +import java.io.FileOutputStream;
  10 +import java.util.Date;
  11 +
  12 +/**
  13 + * Excel2007表格Poi操作类。
  14 + * TODO:以后测style需要重用
  15 + */
  16 +public class Excel2007PoiOperator implements ExcelPoiOperator {
  17 + @Override
  18 + public Cell createCell(
  19 + Workbook workbook, Row row, short columnIndex,
  20 + Object value, int valueType,
  21 + HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment,
  22 + BorderStyle borderStyle, java.awt.Color borderColor,
  23 + short fontSize, java.awt.Color fontColor, String fontName,
  24 + java.awt.Color backgroudColor, FillPatternType fillPatternType) {
  25 +
  26 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  27 + XSSFRow xssfRow = (XSSFRow) row;
  28 +
  29 + CreationHelper creationHelper = xssfWorkbook.getCreationHelper();
  30 +
  31 + // 1、创建单元格对象
  32 + XSSFCell xssfCell = xssfRow.createCell(columnIndex);
  33 +
  34 + // 2、设定样式
  35 + XSSFCellStyle xssfCellStyle = xssfWorkbook.createCellStyle();
  36 +
  37 + // 设定值及数据格式
  38 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  39 + if (valueType == XSSFCell.CELL_TYPE_STRING) {
  40 + xssfCellStyle.setDataFormat(dataFormat.getFormat("@"));
  41 + xssfCell.setCellValue(creationHelper.createRichTextString(String.valueOf(value)));
  42 + } else if (valueType == XSSFCell.CELL_TYPE_NUMERIC) {
  43 + if (value instanceof Date) { // 日期
  44 + xssfCellStyle.setDataFormat(dataFormat.getFormat("yyyy-mm-dd"));
  45 + xssfCell.setCellValue((Date) value);
  46 + } else if (value instanceof Double) {
  47 + xssfCellStyle.setDataFormat(dataFormat.getFormat("0.00"));
  48 + xssfCell.setCellValue((Double) value);
  49 + } else if (value instanceof Integer) {
  50 + xssfCellStyle.setDataFormat(dataFormat.getFormat("0"));
  51 + xssfCell.setCellValue(Double.valueOf(value.toString()));
  52 + } else {
  53 + throw new RuntimeException("Excel2007 只支持 String Date Double Integer 单元格类型");
  54 + }
  55 + } else if (valueType == XSSFCell.CELL_TYPE_BLANK) {
  56 + xssfCell.setCellType(Cell.CELL_TYPE_BLANK);
  57 + } else {
  58 + throw new RuntimeException("暂时不支持字符串、日期、数字以外的类型");
  59 + }
  60 +
  61 + // 对齐方式
  62 + xssfCellStyle.setAlignment(horizontalAlignment);
  63 + xssfCellStyle.setVerticalAlignment(verticalAlignment);
  64 +
  65 + // 边框样式
  66 + xssfCellStyle.setBorderTop(borderStyle);
  67 + xssfCellStyle.setTopBorderColor(new XSSFColor(borderColor));
  68 + xssfCellStyle.setBorderBottom(borderStyle);
  69 + xssfCellStyle.setBottomBorderColor(new XSSFColor(borderColor));
  70 + xssfCellStyle.setBorderLeft(borderStyle);
  71 + xssfCellStyle.setLeftBorderColor(new XSSFColor(borderColor));
  72 + xssfCellStyle.setBorderRight(borderStyle);
  73 + xssfCellStyle.setRightBorderColor(new XSSFColor(borderColor));
  74 +
  75 + // 字体颜色
  76 + XSSFFont font = xssfWorkbook.createFont();
  77 + font.setColor(new XSSFColor(fontColor));
  78 + font.setFontHeightInPoints(fontSize);
  79 + font.setFontName(fontName);
  80 + xssfCellStyle.setFont(font);
  81 +
  82 +
  83 + // 单元背景色
  84 + xssfCellStyle.setFillForegroundColor(new XSSFColor(backgroudColor));
  85 + xssfCellStyle.setFillPattern(fillPatternType);
  86 +
  87 + // TODO
  88 +
  89 + xssfCell.setCellStyle(xssfCellStyle);
  90 + return xssfCell;
  91 + }
  92 +
  93 + @Override
  94 + public Cell createStringCell(
  95 + Workbook workbook, Row row, short columnIndex,
  96 + String value) {
  97 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  98 + XSSFRow xssfRow = (XSSFRow) row;
  99 +
  100 + XSSFCell xssfCell = (XSSFCell) createCell(
  101 + xssfWorkbook, xssfRow, columnIndex,
  102 + value, XSSFCell.CELL_TYPE_STRING,
  103 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  104 + BorderStyle.MEDIUM, new java.awt.Color(0xdedede),
  105 + (short) 13, new java.awt.Color(0x2765A7), "宋体",
  106 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  107 + );
  108 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  109 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("@"));
  110 + return xssfCell;
  111 + }
  112 +
  113 + @Override
  114 + public Cell createStringCell(
  115 + Workbook workbook, Row row, short columnIndex,
  116 + String value,
  117 + Color backgroudColor) {
  118 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  119 + XSSFRow xssfRow = (XSSFRow) row;
  120 +
  121 + XSSFCell xssfCell = (XSSFCell) createCell(
  122 + xssfWorkbook, xssfRow, columnIndex,
  123 + value, XSSFCell.CELL_TYPE_STRING,
  124 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  125 + BorderStyle.MEDIUM, new java.awt.Color(0xdedede),
  126 + (short) 13, new java.awt.Color(0x2765A7), "宋体",
  127 + backgroudColor, FillPatternType.SOLID_FOREGROUND
  128 + );
  129 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  130 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("@"));
  131 + return xssfCell;
  132 + }
  133 +
  134 + @Override
  135 + public Cell createIntegerCell(
  136 + Workbook workbook, Row row, short columnIndex,
  137 + Integer value) {
  138 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  139 + XSSFRow xssfRow = (XSSFRow) row;
  140 +
  141 + XSSFCell xssfCell = (XSSFCell) createCell(
  142 + xssfWorkbook, xssfRow, columnIndex,
  143 + value, XSSFCell.CELL_TYPE_NUMERIC,
  144 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  145 + BorderStyle.MEDIUM, new Color(0xdedede),
  146 + (short) 13, new Color(0x2765A7), "宋体",
  147 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  148 + );
  149 +
  150 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  151 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0"));
  152 + return xssfCell;
  153 + }
  154 +
  155 + @Override
  156 + public Cell createIntegerCell(
  157 + Workbook workbook, Row row, short columnIndex,
  158 + Integer value,
  159 + Color backgroudColor) {
  160 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  161 + XSSFRow xssfRow = (XSSFRow) row;
  162 +
  163 + XSSFCell xssfCell = (XSSFCell) createCell(
  164 + xssfWorkbook, xssfRow, columnIndex,
  165 + value, XSSFCell.CELL_TYPE_NUMERIC,
  166 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  167 + BorderStyle.MEDIUM, new Color(0xdedede),
  168 + (short) 13, new Color(0x2765A7), "宋体",
  169 + backgroudColor, FillPatternType.SOLID_FOREGROUND
  170 + );
  171 +
  172 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  173 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0"));
  174 + return xssfCell;
  175 + }
  176 +
  177 + @Override
  178 + public Cell createDoubleCell(
  179 + Workbook workbook, Row row, short columnIndex,
  180 + Double value) {
  181 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  182 + XSSFRow xssfRow = (XSSFRow) row;
  183 +
  184 + XSSFCell xssfCell = (XSSFCell) createCell(
  185 + xssfWorkbook, xssfRow, columnIndex,
  186 + value, XSSFCell.CELL_TYPE_NUMERIC,
  187 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  188 + BorderStyle.MEDIUM, new Color(0xdedede),
  189 + (short) 13, new Color(0x2765A7), "宋体",
  190 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  191 + );
  192 +
  193 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  194 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0.00"));
  195 + return xssfCell;
  196 + }
  197 +
  198 + @Override
  199 + public Cell createDoubleCell(
  200 + Workbook workbook, Row row, short columnIndex,
  201 + Double value,
  202 + Color backgroudColor) {
  203 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  204 + XSSFRow xssfRow = (XSSFRow) row;
  205 +
  206 + XSSFCell xssfCell = (XSSFCell) createCell(
  207 + xssfWorkbook, xssfRow, columnIndex,
  208 + value, XSSFCell.CELL_TYPE_NUMERIC,
  209 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  210 + BorderStyle.MEDIUM, new Color(0xdedede),
  211 + (short) 13, new Color(0x2765A7), "宋体",
  212 + backgroudColor, FillPatternType.SOLID_FOREGROUND
  213 + );
  214 +
  215 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  216 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0.00"));
  217 + return xssfCell;
  218 + }
  219 +
  220 + @Override
  221 + public Cell createBlankCell(
  222 + Workbook workbook, Row row, short columnIndex) {
  223 + return createCell(
  224 + workbook, row, columnIndex,
  225 + null, XSSFCell.CELL_TYPE_BLANK,
  226 + HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
  227 + BorderStyle.MEDIUM, new Color(0xdedede),
  228 + (short) 13, new Color(0x2765A7), "宋体",
  229 + new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
  230 + );
  231 + }
  232 +
  233 + @Override
  234 + public Cell setCellDataFormat(Workbook workbook, Cell cell, String fmt) {
  235 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  236 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  237 + cell.getCellStyle().setDataFormat(dataFormat.getFormat(fmt));
  238 + return cell;
  239 + }
  240 +
  241 + @Override
  242 + public Cell setCellBackground(Cell cell, Color color) {
  243 + XSSFCell xssfCell = (XSSFCell) cell;
  244 + xssfCell.getCellStyle().setFillForegroundColor(new XSSFColor(color));
  245 + return cell;
  246 + }
  247 +
  248 + @Override
  249 + public Workbook createWorkBook() {
  250 + return new XSSFWorkbook();
  251 + }
  252 +
  253 + @Override
  254 + public Sheet createWorkBookSheet(Workbook workbook, String sheetName) {
  255 + return workbook.createSheet(WorkbookUtil.createSafeSheetName(sheetName));
  256 + }
  257 +
  258 + @Override
  259 + public Row createSheetRow(Sheet sheet, int rowIndex) {
  260 + XSSFSheet xssfSheet = (XSSFSheet) sheet;
  261 + return xssfSheet.createRow(rowIndex);
  262 + }
  263 +
  264 + @Override
  265 + public void writeExcel(File excelFile, Workbook workbook) {
  266 + try {
  267 + XSSFWorkbook xssfWorkbook = (XSSFWorkbook) workbook;
  268 + FileOutputStream fileOutputStream = new FileOutputStream(excelFile);
  269 + xssfWorkbook.write(fileOutputStream);
  270 + } catch (Exception exp) {
  271 + throw new RuntimeException(exp);
  272 + }
  273 +
  274 + }
  275 +}
... ...
src/main/java/com/bsth/service/schedule/datatools/ExcelPoiOperator.java 0 → 100644
  1 +package com.bsth.service.schedule.datatools;
  2 +
  3 +import org.apache.poi.ss.usermodel.*;
  4 +
  5 +import java.awt.Color;
  6 +import java.io.File;
  7 +
  8 +/**
  9 + * Excel表格Poi操作接口。
  10 + */
  11 +public interface ExcelPoiOperator {
  12 +
  13 +
  14 + //---------------- 创建单元格 ---------------//
  15 +
  16 + Cell createCell(
  17 + Workbook workbook, Row row, short columnIndex,
  18 + Object value, int valueType,
  19 + HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment,
  20 + BorderStyle borderStyle, java.awt.Color borderColor,
  21 + short fontSize, java.awt.Color fontColor, String fontName,
  22 + java.awt.Color backgroudColor, FillPatternType fillPatternType
  23 + );
  24 +
  25 + Cell createStringCell(
  26 + Workbook workbook, Row row, short columnIndex,
  27 + String value
  28 + );
  29 +
  30 + Cell createStringCell(
  31 + Workbook workbook, Row row, short columnIndex,
  32 + String value,
  33 + java.awt.Color backgroudColor
  34 + );
  35 +
  36 + Cell createIntegerCell(
  37 + Workbook workbook, Row row, short columnIndex,
  38 + Integer value
  39 + );
  40 +
  41 + Cell createIntegerCell(
  42 + Workbook workbook, Row row, short columnIndex,
  43 + Integer value,
  44 + java.awt.Color backgroudColor
  45 + );
  46 +
  47 + Cell createDoubleCell(
  48 + Workbook workbook, Row row, short columnIndex,
  49 + Double value
  50 + );
  51 +
  52 + Cell createDoubleCell(
  53 + Workbook workbook, Row row, short columnIndex,
  54 + Double value,
  55 + java.awt.Color backgroudColor
  56 + );
  57 +
  58 + Cell createBlankCell(
  59 + Workbook workbook, Row row, short columnIndex
  60 + );
  61 +
  62 + //---------------- 创建单元格数据格式 ---------------//
  63 +
  64 + Cell setCellDataFormat(Workbook workbook, Cell cell, String fmt);
  65 +
  66 + Cell setCellBackground(Cell cell, Color color);
  67 +
  68 + //---------------- 创建workbook,sheet,row ---------------//
  69 + Workbook createWorkBook();
  70 + Sheet createWorkBookSheet(Workbook workbook, String sheetName);
  71 + Row createSheetRow(Sheet sheet, int rowIndex);
  72 +
  73 + //---------------- 生成文件 ---------------//
  74 + void writeExcel(File excelFile, Workbook workbook);
  75 +}
... ...
src/main/java/com/bsth/service/schedule/datatools/TTInfoDetailDataToolsImpl.java
... ... @@ -14,10 +14,6 @@ import org.apache.commons.lang3.StringUtils;
14 14 import org.apache.poi.ss.usermodel.Cell;
15 15 import org.apache.poi.ss.usermodel.Row;
16 16 import org.apache.poi.ss.util.CellRangeAddress;
17   -import org.apache.poi.ss.util.WorkbookUtil;
18   -import org.apache.poi.xssf.usermodel.XSSFCell;
19   -import org.apache.poi.xssf.usermodel.XSSFRow;
20   -import org.apache.poi.xssf.usermodel.XSSFSheet;
21 17 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
22 18 import org.joda.time.DateTime;
23 19 import org.joda.time.LocalTime;
... ... @@ -31,7 +27,6 @@ import org.springframework.stereotype.Service;
31 27  
32 28 import java.awt.*;
33 29 import java.io.File;
34   -import java.io.FileOutputStream;
35 30 import java.io.PrintWriter;
36 31 import java.io.StringWriter;
37 32 import java.util.*;
... ... @@ -438,14 +433,14 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
438 433 }
439 434 }
440 435  
441   - private void createDynamicTTinfoStatSheet(XSSFWorkbook wb, DTInfos dtInfos) {
442   - XSSFSheet sheet = wb.createSheet(WorkbookUtil.createSafeSheetName("时刻表信息_统计"));
  436 + private void createDynamicTTinfoStatSheet(org.apache.poi.ss.usermodel.Workbook wb, DTInfos dtInfos, ExcelPoiOperator excelPoiOperator) {
  437 + org.apache.poi.ss.usermodel.Sheet sheet = excelPoiOperator.createWorkBookSheet(wb, "时刻表信息_统计");
443 438  
444 439 //-------------------------------- 1、路牌班次数据 -------------------------------//
445 440 List<LpObj> lpObjList = dtInfos.getLpObjList();
446 441  
447 442 // 构建第一行数据
448   - XSSFRow lpHeadRow = sheet.createRow((short) 0);
  443 + Row lpHeadRow = excelPoiOperator.createSheetRow(sheet, 0);
449 444 if (lpObjList.size() == 0) {
450 445 throw new RuntimeException("没有班次数据!");
451 446 }
... ... @@ -455,40 +450,36 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
455 450 }
456 451  
457 452 // 构造表头
458   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short)0, "路牌", new Color(0x96b9d7));
  453 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 0, "路牌", new Color(0x96b9d7));
  454 +
459 455 StationRoute station1 = stationRouteService.findById(lpObjList.get(0).getStationRouteId1());
460 456 StationRoute station2 = stationRouteService.findById(lpObjList.get(1).getStationRouteId2());
461 457 for (int i = 0; i < groupCount; i++) {
462   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 1),
463   - station1.getStationName(), new Color(0x96b9d7));
464   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 2),
465   - station2.getStationName(), new Color(0x96b9d7));
  458 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (i * 2 + 1), station1.getStationName(), new Color(0x96b9d7));
  459 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (i * 2 + 2), station2.getStationName(), new Color(0x96b9d7));
466 460 }
467   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 1),
468   - "路牌工时", new Color(0x96b9d7));
469   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 2),
470   - "营运班次数", new Color(0x96b9d7));
  461 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 1), "路牌工时", new Color(0x96b9d7));
  462 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 2), "营运班次数", new Color(0x96b9d7));
471 463  
472 464 // 构建每个路牌的班次数据
473 465 for (int i = 0; i < lpObjList.size(); i++) {
474 466 LpObj lpObj = lpObjList.get(i);
475   - XSSFRow lpRow = sheet.createRow((short) (i + 1));
476   - PoiUtils.createStringXSSFCell(wb, lpRow, (short) 0, lpObj.getLpname());
  467 + Row lpRow = excelPoiOperator.createSheetRow(sheet, i + 1);
  468 + excelPoiOperator.createStringCell(wb, lpRow, (short) 0, lpObj.getLpname());
477 469 for (int j = 0; j < groupCount; j++) {
478   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 1));
479   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 2));
  470 + excelPoiOperator.createBlankCell(wb, lpRow, (short) (j * 2 + 1));
  471 + excelPoiOperator.createBlankCell(wb, lpRow, (short) (j * 2 + 2));
480 472 }
481 473 for (BcObj bcObj : lpObj.getBcObjList()) {
482 474 if (bcObj.getBcType() == BcType.NORMAL) {
483   - Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 1));
484   - cell.setCellValue(bcObj.getFcsjDesc());
  475 + lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 1)).setCellValue(bcObj.getFcsjDesc());
485 476 }
486 477 }
487 478 // 路牌工时/班次数
488   - PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 1),
  479 + excelPoiOperator.createDoubleCell(wb, lpRow, (short) (groupCount * 2 + 1),
489 480 lpObj.getZgs() / 60);
490 481 // 营运班次数
491   - PoiUtils.createIntegerXSSFCell(wb, lpRow, (short) (groupCount * 2 + 2),
  482 + excelPoiOperator.createIntegerCell(wb, lpRow, (short) (groupCount * 2 + 2),
492 483 lpObj.getZbc());
493 484 }
494 485  
... ... @@ -514,9 +505,9 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
514 505  
515 506 int startrow = lpObjList.size() + 3;
516 507 for (int i = startrow; i <= startrow + 22; i++) {
517   - XSSFRow xssfRow = sheet.createRow(i);
  508 + Row row = excelPoiOperator.createSheetRow(sheet, i);
518 509 for (int j = 0; j < 10; j++) {
519   - PoiUtils.createStringXSSFCell(wb, xssfRow, (short) j, "");
  510 + excelPoiOperator.createStringCell(wb, row, (short) j, "");
520 511  
521 512 }
522 513 }
... ... @@ -537,27 +528,27 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
537 528 StatInfo statInfo = statInfos.get(i);
538 529  
539 530 // 1、统计序号
540   - PoiUtils.setIntegerStyleXSSFCellStyle(wb, sheet.getRow(startrow + 2 + i).getCell(0));
  531 + excelPoiOperator.setCellDataFormat(wb, sheet.getRow(startrow + 2 + i).getCell(0), "0");
541 532 sheet.getRow(startrow + 2 + i).getCell(0).setCellValue(i);
542 533  
543 534 // 2、统计项目
544 535 sheet.getRow(startrow + 2 + i).getCell(1).setCellValue(statInfo.getStatItem());
545 536  
546 537 // 3、统计数值
547   - PoiUtils.setDoubleStyleXSSFCellStyle(wb, sheet.getRow(startrow + 2 + i).getCell(9));
  538 + excelPoiOperator.setCellDataFormat(wb, sheet.getRow(startrow + 2 + i).getCell(9), "0.00");
548 539 sheet.getRow(startrow + 2 + i).getCell(9).setCellValue(statInfo.getStatValue());
549 540 }
550 541  
551 542 }
552 543  
553   - private void createDynamicTTinfoSheet(XSSFWorkbook wb, DTInfos dtInfos) {
554   - XSSFSheet sheet = wb.createSheet(WorkbookUtil.createSafeSheetName("时刻表信息"));
  544 + private void createDynamicTTinfoSheet(org.apache.poi.ss.usermodel.Workbook wb, DTInfos dtInfos, ExcelPoiOperator excelPoiOperator) {
  545 + org.apache.poi.ss.usermodel.Sheet sheet = excelPoiOperator.createWorkBookSheet(wb, "时刻表信息");
555 546  
556 547 //-------------------------------- 1、路牌班次数据 -------------------------------//
557 548 List<LpObj> lpObjList = dtInfos.getLpObjList();
558 549  
559 550 // 构建第一行数据
560   - XSSFRow lpHeadRow = sheet.createRow((short) 0);
  551 + Row lpHeadRow = excelPoiOperator.createSheetRow(sheet, 0);
561 552 if (lpObjList.size() == 0) {
562 553 throw new RuntimeException("没有班次数据!");
563 554 }
... ... @@ -567,72 +558,61 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
567 558 }
568 559  
569 560 // 构造表头,添加一个进场,添加一个出场
570   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short)0, "路牌", new Color(0x96b9d7));
  561 +
  562 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 0, "路牌", new Color(0x96b9d7));
  563 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 1, "报到", new Color(0x96b9d7));
  564 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) 2, "出场", new Color(0x96b9d7));
  565 +
  566 +
571 567 StationRoute station1 = stationRouteService.findById(lpObjList.get(0).getStationRouteId1());
572 568 StationRoute station2 = stationRouteService.findById(lpObjList.get(1).getStationRouteId2());
573   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (1),
574   - "报到", new Color(0x96b9d7));
575   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (2),
576   - "出场", new Color(0x96b9d7));
577 569 for (int i = 1; i <= groupCount; i++) {
578   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 1),
579   - station1.getStationName(), new Color(0x96b9d7));
580   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 2),
581   - station2.getStationName(), new Color(0x96b9d7));
  570 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (i * 2 + 1), station1.getStationName(), new Color(0x96b9d7));
  571 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (i * 2 + 2), station2.getStationName(), new Color(0x96b9d7));
582 572 }
583 573  
584 574 // 最后一个进场需要变成三个班次
585 575 // 1个分班进场班次插入到前面的班次
586 576 // 后面添加两个班次,1个到场班次,1个离场班次
587   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 3),
588   - "到场", new Color(0x96b9d7));
589   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 4),
590   - "离场", new Color(0x96b9d7));
  577 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 3), "到场", new Color(0x96b9d7));
  578 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 4), "离场", new Color(0x96b9d7));
591 579  
592 580 // 路牌统计字段
593   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 5),
594   - "总公里", new Color(0x96b9d7));
595   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 6),
596   - "营业公里", new Color(0x96b9d7));
597   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 7),
598   - "空驶公里", new Color(0x96b9d7));
599   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 8),
600   - "总工时", new Color(0x96b9d7));
601   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 9),
602   - "营业工时", new Color(0x96b9d7));
603   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 10),
604   - "营运班次", new Color(0x96b9d7));
  581 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 5), "总公里", new Color(0x96b9d7));
  582 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 6), "营业公里", new Color(0x96b9d7));
  583 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 7), "空驶公里", new Color(0x96b9d7));
  584 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 8), "总工时", new Color(0x96b9d7));
  585 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 9), "营业工时", new Color(0x96b9d7));
  586 + excelPoiOperator.createStringCell(wb, lpHeadRow, (short) (groupCount * 2 + 10), "营运班次", new Color(0x96b9d7));
605 587  
606 588 // 构建每个路牌的班次数据
  589 + Cell cell = null;
607 590 for (int i = 0; i < lpObjList.size(); i++) {
608 591 LpObj lpObj = lpObjList.get(i);
609   - XSSFRow lpRow = sheet.createRow((short) (i + 1));
610   - PoiUtils.createStringXSSFCell(wb, lpRow, (short) 0, lpObj.getLpname());
  592 + Row lpRow = excelPoiOperator.createSheetRow(sheet, i + 1);
  593 + excelPoiOperator.createStringCell(wb, lpRow, (short) 0, lpObj.getLpname());
611 594  
612 595 // 创建空白单元格,并设置字符串格式
613   - XSSFCell xssfCell = null;
  596 + cell = excelPoiOperator.createBlankCell(wb, lpRow, (short) 1);
  597 + excelPoiOperator.setCellDataFormat(wb, cell, "@");
614 598  
615   - xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (1));
616   - PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
617   -
618   - xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (2));
619   - PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
  599 + cell = excelPoiOperator.createBlankCell(wb, lpRow, (short) 2);
  600 + excelPoiOperator.setCellDataFormat(wb, cell, "@");
620 601  
621 602 for (int j = 1; j <= groupCount; j++) {
622   - xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 1));
623   - PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
624   - xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 2));
625   - PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
  603 + cell = excelPoiOperator.createBlankCell(wb, lpRow, (short) (j * 2 + 1));
  604 + excelPoiOperator.setCellDataFormat(wb, cell, "@");
  605 + cell = excelPoiOperator.createBlankCell(wb, lpRow, (short) (j * 2 + 2));
  606 + excelPoiOperator.setCellDataFormat(wb, cell, "@");
626 607 }
627 608  
628   - xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 3));
629   - PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
630   - xssfCell = PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 4));
631   - PoiUtils.setStringStyleXSSFCellStyle(wb, xssfCell);
  609 + cell = excelPoiOperator.createBlankCell(wb, lpRow, (short) (groupCount * 2 + 3));
  610 + excelPoiOperator.setCellDataFormat(wb, cell, "@");
  611 + cell = excelPoiOperator.createBlankCell(wb, lpRow, (short) (groupCount * 2 + 4));
  612 + excelPoiOperator.setCellDataFormat(wb, cell, "@");
632 613  
633 614 for (int j = 0; j < lpObj.getBcObjList().size(); j++) {
634 615 BcObj bcObj = lpObj.getBcObjList().get(j); // 当前班次
635   - Cell cell = null; // 待处理的单元格
636 616  
637 617 switch (bcObj.getBcType()) {
638 618 case BD: // 报到班次
... ... @@ -680,14 +660,16 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
680 660 }
681 661  
682 662 // 路牌统计字段
683   - PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 5), lpObj.getZlc());
684   - PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 6), lpObj.getYylc());
685   - PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 7), lpObj.getKslc());
686   - PoiUtils.createStringXSSFCell(wb, lpRow, (short) (groupCount * 2 + 8),
  663 + excelPoiOperator.createDoubleCell(wb, lpRow, (short) (groupCount * 2 + 5), lpObj.getZlc());
  664 + excelPoiOperator.createDoubleCell(wb, lpRow, (short) (groupCount * 2 + 6), lpObj.getYylc());
  665 + excelPoiOperator.createDoubleCell(wb, lpRow, (short) (groupCount * 2 + 7), lpObj.getKslc());
  666 + cell = excelPoiOperator.createStringCell(wb, lpRow, (short) (groupCount * 2 + 8),
687 667 String.format("%d%s%d", (int) (lpObj.getZgs() / 60), ":", (int) (lpObj.getZgs() % 60)));
688   - PoiUtils.createStringXSSFCell(wb, lpRow, (short) (groupCount * 2 + 9),
  668 + excelPoiOperator.setCellDataFormat(wb, cell, "[h]:mm");
  669 + cell = excelPoiOperator.createStringCell(wb, lpRow, (short) (groupCount * 2 + 9),
689 670 String.format("%d%s%d", (int) (lpObj.getYygs() / 60), ":", (int) (lpObj.getYygs() % 60)));
690   - PoiUtils.createIntegerXSSFCell(wb, lpRow, (short) (groupCount * 2 + 10), lpObj.getYybc());
  671 + excelPoiOperator.setCellDataFormat(wb, cell, "[h]:mm");
  672 + excelPoiOperator.createIntegerCell(wb, lpRow, (short) (groupCount * 2 + 10), lpObj.getYybc());
691 673  
692 674 }
693 675  
... ... @@ -710,24 +692,33 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
710 692 }
711 693  
712 694 @Override
713   - public DataToolsFile exportDynamicTTinfo(DTInfos dtInfos) throws ScheduleException {
  695 + public DataToolsFile exportDynamicTTinfo(DTInfos dtInfos, DataToolsFileType type) throws ScheduleException {
714 696 try {
  697 + ExcelPoiOperator excelPoiOperator;
  698 + if (type == DataToolsFileType.XLS) {
  699 + excelPoiOperator = new Excel2003PoiOperator();
  700 + } else if (type == DataToolsFileType.XLSX) {
  701 + excelPoiOperator = new Excel2007PoiOperator();
  702 + } else {
  703 + throw new RuntimeException("未知的导出格式==>" + type);
  704 + }
  705 +
715 706 // 使用POI,创建xlsx文件
716   - XSSFWorkbook wb = new XSSFWorkbook();
717   - this.createDynamicTTinfoSheet(wb, dtInfos);
718   - this.createDynamicTTinfoStatSheet(wb, dtInfos);
  707 + org.apache.poi.ss.usermodel.Workbook wb = excelPoiOperator.createWorkBook();
  708 + this.createDynamicTTinfoSheet(wb, dtInfos, excelPoiOperator);
  709 + this.createDynamicTTinfoStatSheet(wb, dtInfos, excelPoiOperator);
719 710  
720 711 // wb内存写入文件
721 712 String filepath = dataToolsProperties.getFileoutputDir() +
722 713 File.separator +
723 714 "动态时刻表-" +
724 715 new DateTime().toString("yyyyMMddHHmmss") + ".xlsx";
725   - FileOutputStream fileOut = new FileOutputStream(filepath);
726   - wb.write(fileOut);
  716 + File file = new File(filepath);
  717 + excelPoiOperator.writeExcel(file, wb);
727 718  
728 719 DataToolsFile dataToolsFile = new DataToolsFile();
729 720 dataToolsFile.setFileType(DataToolsFileType.XLSX);
730   - dataToolsFile.setFile(new File(filepath));
  721 + dataToolsFile.setFile(file);
731 722  
732 723 return dataToolsFile;
733 724  
... ...
src/main/java/com/bsth/service/schedule/datatools/TTinfoDetailDynamicData.java
... ... @@ -2,6 +2,7 @@ package com.bsth.service.schedule.datatools;
2 2  
3 3 import com.bsth.service.schedule.exception.ScheduleException;
4 4 import com.bsth.service.schedule.utils.DataToolsFile;
  5 +import com.bsth.service.schedule.utils.DataToolsFileType;
5 6 import com.fasterxml.jackson.annotation.JsonCreator;
6 7 import com.fasterxml.jackson.annotation.JsonValue;
7 8  
... ... @@ -374,5 +375,5 @@ public interface TTinfoDetailDynamicData {
374 375 * @return
375 376 * @throws ScheduleException
376 377 */
377   - public DataToolsFile exportDynamicTTinfo(DTInfos dtInfos) throws ScheduleException;
378   -}
379 378 \ No newline at end of file
  379 + public DataToolsFile exportDynamicTTinfo(DTInfos dtInfos, DataToolsFileType type) throws ScheduleException;
  380 +}
... ...
src/main/java/com/bsth/service/schedule/impl/TTInfoDetailServiceImpl.java
... ... @@ -145,8 +145,8 @@ public class TTInfoDetailServiceImpl extends BServiceImpl&lt;TTInfoDetail, Long&gt; im
145 145 }
146 146  
147 147 @Override
148   - public DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos) throws ScheduleException {
149   - return tTinfoDetailDynamicData.exportDynamicTTinfo(dtInfos);
  148 + public DataToolsFile exportDynamicTTinfo(TTinfoDetailDynamicData.DTInfos dtInfos, DataToolsFileType type) throws ScheduleException {
  149 + return tTinfoDetailDynamicData.exportDynamicTTinfo(dtInfos, type);
150 150 }
151 151  
152 152 @Override
... ...
src/main/resources/static/pages/base/timesmodel/gantt.html
... ... @@ -50,9 +50,31 @@
50 50 <!--<div class="btn-group btn-group-devided checkbtn" data-toggle="buttons">-->
51 51 <!--<a class="btn btn-circle blue checkAdd" href="javascript:;" data-pjax><i class="fa fa-check"></i> 保存数据</a>-->
52 52 <!--</div>-->
53   - <div class="btn-group btn-group-devided exportbtn" data-toggle="buttons">
54   - <!--<a class="btn btn-circle blue exportAdd" href="javascript:;" data-pjax><i class="fa fa-file-excel-o"></i> 导出数据</a>-->
  53 +
  54 + <div class="btn-group exportbtn">
  55 + <a href="javascript:" class="btn red btn-outline btn-circle exportAdd" data-toggle="dropdown">
  56 + <i class="fa fa-file-excel-o"></i>
  57 + <span class="exportAddSpan">导出数据</span>
  58 + <i class="fa fa-angle-down"></i>
  59 + </a>
  60 + <ul class="dropdown-menu pull-right">
  61 + <li>
  62 + <a href="javascript:" class="tool-action exportAddXls">
  63 + <i class="fa fa-file-excel-o"></i>
  64 + Excel97 xls
  65 + </a>
  66 + </li>
  67 + <li>
  68 + <a href="javascript:" class="tool-action exportAddXlsx">
  69 + <i class="fa fa-file-excel-o"></i>
  70 + Excel2007 xlsx
  71 + </a>
  72 + </li>
  73 + </ul>
55 74 </div>
  75 +
  76 +
  77 +
56 78 <div class="btn-group checkbtn">
57 79 <a href="javascript:" class="btn red btn-outline btn-circle" data-toggle="dropdown" aria-expanded="false">
58 80 <i class="fa fa-cog"></i>
... ...
src/main/resources/static/pages/base/timesmodel/js/gantt.js
... ... @@ -83,7 +83,6 @@
83 83 // TODO:绘制gantt图表
84 84 // TODO:var seDate = getksjssj(null,seMap.s); 关联参数必须设置
85 85 // TODO:CSMap.maxCar 之后要设定一下的
86   - $(".exportbtn").html("<a class=\"btn btn-circle blue exportAdd\" href=\"javascript:;\" data-pjax><i class=\"fa fa-file-excel-o\"></i> 导出数据</a>");
87 86 data = Main_v2.BXPplaceClassesTime03(_paramObj, CSMap.maxCar);
88 87 Main_v2.exportDataConfig(data.aInternalLpObj);
89 88 }
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js
... ... @@ -1548,6 +1548,8 @@ var InternalScheduleObj = function(paramObj, lpArray, factory) {
1548 1548 oLp.fnGetBcChainInfo(0)["e_q"],
1549 1549 oLp.fnGetBcChainInfo(0)["e_b"]
1550 1550 );
  1551 + oEndBc.fnSetIsLastBc(false); // 有可能最后一个班次是吃饭班次,重置
  1552 + oEndBc.fnSetEatTime(0); // 有可能最后一个班次是吃饭班次,重置
1551 1553 aOtherBc.push(_factory.createBcObj(
1552 1554 oLp, "in", true, 1,
1553 1555 oEndBc.getArrTimeObj(),
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/main_v2.js
... ... @@ -821,7 +821,7 @@ var Main_v2 = function() {
821 821 * @param aInternalLpObj 内部路牌对象列表
822 822 */
823 823 exportDataConfig: function(aInternalLpObj) {
824   - $('.exportAdd').on('click',function() {
  824 + $('.exportAddXls').on('click', function() {
825 825 var aInfos = {
826 826 "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
827 827 "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
... ... @@ -830,12 +830,12 @@ var Main_v2 = function() {
830 830 console.log(aInfos);
831 831  
832 832 $(".exportAdd").addClass("disabled");
833   - $(".exportAdd").html("<i class=\"fa fa-spinner\" aria-hidden=\"true\"></i>" + " 正在导出...");
  833 + $(".exportAddSpan").html("正在导出...");
834 834  
835 835 // 提交
836 836 $.ajax({
837 837 type: 'POST',
838   - url: "/tidc/exportDTDFile",
  838 + url: "/tidc/exportDTDFile/xls",
839 839 dataType: 'binary',
840 840 contentType: "application/json",
841 841 data: JSON.stringify(aInfos),
... ... @@ -843,16 +843,48 @@ var Main_v2 = function() {
843 843 Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xls");
844 844  
845 845 $(".exportAdd").removeClass("disabled");
846   - $(".exportAdd").html("<i class=\"fa fa-file-excel-o\"></i>" + " 导出数据");
  846 + $(".exportAddSpan").html(" 导出数据");
847 847 },
848 848 error: function(xhr, type){
849 849 alert('错误:TODO');
850 850  
851 851 $(".exportAdd").removeClass("disabled");
852   - $(".exportAdd").html("<i class=\"fa fa-file-excel-o\"></i>" + " 导出数据");
  852 + $(".exportAddSpan").html(" 导出数据");
853 853 }
854 854 });
  855 + });
  856 +
  857 + $('.exportAddXlsx').on('click', function() {
  858 + var aInfos = {
  859 + "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
  860 + "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
  861 + };
  862 +
  863 + console.log(aInfos);
  864 +
  865 + $(".exportAdd").addClass("disabled");
  866 + $(".exportAddSpan").html("正在导出...");
  867 +
  868 + // 提交
  869 + $.ajax({
  870 + type: 'POST',
  871 + url: "/tidc/exportDTDFile/xlsx",
  872 + dataType: 'binary',
  873 + contentType: "application/json",
  874 + data: JSON.stringify(aInfos),
  875 + success: function(data){
  876 + Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xlsx");
855 877  
  878 + $(".exportAdd").removeClass("disabled");
  879 + $(".exportAddSpan").html(" 导出数据");
  880 + },
  881 + error: function(xhr, type){
  882 + alert('错误:TODO');
  883 +
  884 + $(".exportAdd").removeClass("disabled");
  885 + $(".exportAddSpan").html(" 导出数据");
  886 + }
  887 + });
856 888 });
857 889 },
858 890  
... ...
src/main/resources/static/pages/base/timesmodel/paramadd.html
1 1 <!-- 统计数据 -->
  2 +<style>
  3 + .form-control:focus {
  4 + border-color: #53ced9;
  5 + }
  6 + .tagsDiv {
  7 + border: 1px solid #c2cad8;
  8 + margin-left: 15px;
  9 + padding: 4px 15px 4px 15px;
  10 + width: 50%;
  11 + }
  12 +</style>
2 13 <div class="modal fade" id="paramadd_mobal" tabindex="-1" role="basic" aria-hidden="true">
3   - <div class="modal-dialog" style="margin-left: 200px;">
4   - <div class="modal-content" style="width: 900px;">
  14 + <div class="modal-dialog" style="margin-left: 100px;">
  15 + <div class="modal-content" style="width: 1000px;">
5 16 <div class="modal-header">
6 17 <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
7 18 <h4 class="modal-title">参数数据 </h4>
... ... @@ -318,6 +329,54 @@
318 329 </div>
319 330 </div>
320 331  
  332 + <div class="form-group">
  333 + <div class="col-md-6">
  334 + <label class="control-label col-md-5"><span class="required"> * </span>停站类型 :</label>
  335 + <div class="col-md-5 tagsDiv">
  336 + <div class="row" style="margin-left: 15px;">
  337 + <input type="text" value="{{map.stt}}" name="stt" id="stoptype_tagsinput" style="display: none;">
  338 + </div>
  339 +
  340 + <div class="row" style="margin-top: 10px;">
  341 + <label class="control-label col-md-4">停站类型:</label>
  342 + <div class="col-md-8">
  343 + <select name="stopType" class="form-control" id="stopType_id">
  344 + <option value="">-- 请选择停站类型 --</option>
  345 + <option value="0">主站停站</option>
  346 + <option value="1">双向停站</option>
  347 + </select>
  348 + </div>
  349 + </div>
  350 +
  351 + <div class="row" style="margin-top: 10px;">
  352 + <label class="control-label col-md-4">主站:</label>
  353 + <div class="col-md-8">
  354 + <select name="masterStop" class="form-control" id="masterStop_id">
  355 + <option value="">请选择...</option>
  356 + <option value="0">{{map.startStationName}}</option>
  357 + <option value="1">{{map.endStationName}}</option>
  358 + </select>
  359 + </div>
  360 + </div>
  361 +
  362 + <div class="row" style="margin-top: 10px;margin-left: 116px;">
  363 + <a href="javascript:" class="btn red" id="stoptype_tagsinput_add">添加</a>
  364 + </div>
  365 + </div>
  366 +
  367 + </div>
  368 +
  369 + <div class="col-md-6">
  370 + <label class="control-label col-md-5">
  371 + <span class="required"> * </span> 建议高峰配车数 :</label>
  372 + <div class="col-md-5">
  373 + <input type="text" class="form-control" placeholder="车辆数" name="gfjypcs"
  374 + id="gfjypcsInput" min="1" value="{{map.gfjypcs}}">
  375 + </div>
  376 + </div>
  377 +
  378 + </div>
  379 +
321 380 <!-- 隐藏字段-时间 -->
322 381 <input type="hidden" name="skbName" value="{{map.skbName}}" id="skbName_id"/>
323 382 <input type="hidden" name="skbmc" value="{{map.skbmc}}" id="skbmc_id"/>
... ... @@ -423,6 +482,8 @@
423 482 // 1、 获取表单内容,并序列化
424 483 var fp = form.serializeJSON();
425 484  
  485 + console.log(fp);
  486 +
426 487 // 2、重新刷新表单数据
427 488 var ganttMap = JSON.parse(window.localStorage.Gantt_AgursData);
428 489 var key;
... ... @@ -431,6 +492,8 @@
431 492 if (ganttMap[key] != fp[key]) {
432 493 ganttMap[key] = fp[key];
433 494 }
  495 + } else {
  496 + ganttMap[key] = fp[key];
434 497 }
435 498 }
436 499 window.localStorage.setItem("Gantt_AgursData",JSON.stringify(ganttMap));
... ... @@ -440,7 +503,7 @@
440 503 var paramObj = pp[0];
441 504 var dataMap = pp[1];
442 505 var csMap = getCSMap(paramObj);
443   - console.log(graph);
  506 + // console.log(graph);
444 507 var data = Main_v2.BXPplaceClassesTime03(paramObj, csMap.maxCar);
445 508 Main_v2.exportDataConfig(data.aInternalLpObj);
446 509  
... ... @@ -491,6 +554,8 @@
491 554 opt.push("<option value='1'>" + d.stationName + "</option>");
492 555 }
493 556 });
  557 + initTagsinput(opt.join(","));
  558 +
494 559 opt.push("<option value='allYes'>起终点站都可以</option>");
495 560 $('#cfdd_id').html(opt.join(""));
496 561 $('#cfdd_id').val(param.cfdd);
... ... @@ -524,10 +589,62 @@
524 589 $('#lateStartTime_id').datetimepicker({format : 'HH:mm',locale: 'zh-cn'});
525 590 $('#lateEndTime_id').datetimepicker({format : 'HH:mm',locale: 'zh-cn'});
526 591  
  592 + });
  593 + });
  594 +
  595 + function initTagsinput(htmlStr) {
  596 + $('#masterStop_id').html(htmlStr);
  597 +
  598 + var elt = $('#stoptype_tagsinput');
  599 + var value = elt.val();
  600 + var stoptype = value.split("/")[0];
  601 + var masterstop = value.split("/")[1];
  602 +
  603 + $('#stopType_id').val(stoptype);
  604 + $('#masterStop_id').val(masterstop);
527 605  
  606 + elt.tagsinput({
  607 + tagClass: function(item) {
  608 + return 'label label-danger label-important';
  609 + },
  610 + itemValue: 'value',
  611 + itemText: 'text'
  612 + });
528 613  
  614 + $('#stoptype_tagsinput').on('beforeItemAdd', function(event) {
  615 + // TODO:这里可以做一些逻辑判定
529 616 });
530   - });
  617 +
  618 + $('#stoptype_tagsinput_add').on('click', function(){
  619 + var stoptype = $("#stopType_id").val();
  620 + var masterstop = $("#masterStop_id").val();
  621 + var masterstop_text = $("#masterStop_id option:selected").text();
  622 +
  623 + if (stoptype && stoptype != "") {
  624 + if (stoptype == "0" && masterstop && masterstop != "") {
  625 + elt.tagsinput('add', {
  626 + "value": stoptype + '/' + masterstop,
  627 + "text": "主站停站" + "/" + masterstop_text
  628 + });
  629 + } else {
  630 + elt.tagsinput('add', {
  631 + "value": 1,
  632 + "text": "双向停站"
  633 + });
  634 + }
  635 + }
  636 + });
  637 +
  638 + if (stoptype && stoptype != "") {
  639 + elt.tagsinput('add', {
  640 + "value": stoptype + '/' + masterstop,
  641 + "text":
  642 + $("#stopType_id option:selected").text() + "/" +
  643 + $("#masterStop_id option:selected").text()
  644 + });
  645 + }
  646 +
  647 + }
531 648  
532 649 function getMinDate(d1,d2) {
533 650 // 1、定义返回字符串.
... ...