package com.bstek.bdf2.export.controller; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFPrintSetup; import org.apache.poi.ss.usermodel.PrintSetup; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import org.springframework.util.Assert; import com.bstek.bdf2.export.csv.CvsReportBuilder; import com.bstek.bdf2.export.excel.ExcelReportBuilder; import com.bstek.bdf2.export.excel.ExcelReportModelGenerater; import com.bstek.bdf2.export.extension.ReportGenerater; import com.bstek.bdf2.export.extension.ReportBuilder; import com.bstek.bdf2.export.model.FileExtension; import com.bstek.bdf2.export.model.ReportForm; import com.bstek.bdf2.export.model.ReportGridHeader; import com.bstek.bdf2.export.model.ReportGrid; import com.bstek.bdf2.export.model.ReportTitle; import com.bstek.bdf2.export.pdf.PdfReportBuilder; import com.bstek.bdf2.export.pdf.PdfReportModelGenerater; import com.bstek.bdf2.export.utils.ExportUtils; import com.bstek.bdf2.export.view.SupportWidget; import com.bstek.dorado.annotation.Expose; import com.bstek.dorado.core.Configure; import com.itextpdf.text.Document; /** * @author matt.yao@bstek.com * @since 2.0 */ @Component(Export2ReportController.BEAN_ID) public class Export2ReportController implements InitializingBean, ApplicationContextAware { public static final String BEAN_ID = "bdf2.Export2ReportController"; @Autowired @Qualifier(ExcelReportModelGenerater.BEAN_ID) public ExcelReportModelGenerater excelReportModelGenerater; @Autowired @Qualifier(ExcelReportBuilder.BEAN_ID) public ExcelReportBuilder excelReportBuilder; @Autowired @Qualifier(PdfReportModelGenerater.BEAN_ID) public PdfReportModelGenerater pdfReportModelGenerater; @Autowired @Qualifier(PdfReportBuilder.BEAN_ID) public PdfReportBuilder pdfReportBuilder; @Autowired @Qualifier(ReportGenerater.BEAN_ID) public ReportGenerater commonReportGenerater; @Autowired @Qualifier(CvsReportBuilder.BEAN_ID) public CvsReportBuilder cvsReportBuilder; public int rowAccessWindowSize = 500; @SuppressWarnings("unchecked") @Expose public Map generateReportFile(Map parameter) throws Exception { String fileName = (String) parameter.get("fileName"); String extension = (String) parameter.get("extension"); int rowSpace = (Integer) parameter.get("rowSpace"); String interceptorName = null; if (parameter.get("interceptorName") != null) { interceptorName = (String) parameter.get("interceptorName"); } String id = UUID.randomUUID().toString(); String location = ExportUtils.getFileStorePath() + id + "_" + fileName + "." + extension; Map titleInfos = (Map) parameter.get("titleInfos"); List> reportInfos = (List>) parameter.get("reportInfos"); ReportTitle reportTitle = excelReportModelGenerater.generateReportTitleModel(titleInfos); if (FileExtension.xls.equals(extension) || FileExtension.xlsx.equals(extension)) { this.generateExcelFile(reportTitle, reportInfos, rowSpace, fileName, location, interceptorName); } else if (FileExtension.pdf.equals(extension)) { this.generatePdfFile(reportTitle, reportInfos, rowSpace, location, interceptorName); } else { this.generateOtherFile(extension, reportTitle, reportInfos, rowSpace, location, interceptorName); } Map outParameter = new HashMap(); outParameter.put("id", id); outParameter.put("name", fileName + "." + extension); return outParameter; } @SuppressWarnings("unchecked") private void generatePdfFile(ReportTitle reportTitle, List> reportInfos, int rowSpace, String fileName, String interceptorName) throws Exception { FileOutputStream out = new FileOutputStream(fileName); Document doc = pdfReportBuilder.createDocument(reportTitle, out); try { for (Map map : reportInfos) { String type = (String) map.get("type"); if (SupportWidget.grid.name().equals(type)) { Map grid = (Map) map.get("grid"); pdfReportBuilder.addGridToDocument(doc, reportTitle, pdfReportModelGenerater.generateReportGridModel(grid, interceptorName)); pdfReportBuilder.addNewline(doc, rowSpace); } else if (SupportWidget.form.name().equals(type)) { Map form = (Map) map.get("form"); ReportForm reportFormModel = pdfReportModelGenerater.generateReportFormModel(form, interceptorName); pdfReportBuilder.addFormToDocument(doc, reportTitle, reportFormModel); pdfReportBuilder.addNewline(doc, rowSpace); } } } finally { doc.close(); out.close(); } } @SuppressWarnings("unchecked") private void generateExcelFile(ReportTitle reportTitle, List> reportInfos, int rowSpace, String fileName, String location, String interceptorName) throws Exception { Workbook workbook = null; if (location.endsWith(FileExtension.xls)) { workbook = excelReportBuilder.createWorkBook2003(); } else if (location.endsWith(FileExtension.xlsx)) { workbook = excelReportBuilder.createWorkBook2007(rowAccessWindowSize); } Assert.notNull(workbook, "the workbook must not be null"); Sheet sheet = excelReportBuilder.createSheet(workbook, fileName); int index = 0; int nextRow = 0; int bottomColumnHeaderCount = 0; for (Map map : reportInfos) { String type = (String) map.get("type"); if (SupportWidget.grid.name().equals(type)) { Map grid = (Map) map.get("grid"); ReportGrid reportGridModel = excelReportModelGenerater.generateReportGridModel(grid, interceptorName); if (index == 0) { List bottomColumnHeaderModelList = new ArrayList(); excelReportBuilder.calculateBottomColumnHeader(reportGridModel.getGridHeaderModelList(), bottomColumnHeaderModelList); bottomColumnHeaderCount = bottomColumnHeaderModelList.size(); reportGridModel.setColumnCount(bottomColumnHeaderCount); nextRow = excelReportBuilder.addTitleToSheet(reportTitle, sheet, bottomColumnHeaderCount - 1); } nextRow = excelReportBuilder.addGridToSheet(reportGridModel, sheet, nextRow); nextRow = nextRow + rowSpace; } else if (SupportWidget.form.name().equals(type)) { Map form = (Map) map.get("form"); ReportForm reportFormModel = excelReportModelGenerater.generateReportFormModel(form, interceptorName); if (index == 0) { int lastColumn = reportFormModel.getColumnCount() * 2 - 1; nextRow = excelReportBuilder.addTitleToSheet(reportTitle, sheet, lastColumn); } nextRow = excelReportBuilder.addFormToSheet(reportFormModel, sheet, nextRow); nextRow = nextRow + rowSpace; } index++; } //打印参数设置 PrintSetup print = sheet.getPrintSetup(); //拿到sheet对象首先 print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //纸张类型 if(bottomColumnHeaderCount > 10){ print.setLandscape(true);//横向打印 }else{ print.setLandscape(false);//横向打印 } print.setScale((short) 68); print.setFitWidth((short)1); sheet.setAutobreaks(false); print.setLeftToRight(true);//列从左向右显示 sheet.setHorizontallyCenter(true);//设置打印页面水平居中 sheet.setMargin(Sheet.BottomMargin,( double ) 0.5 );// 页边距(下) sheet.setMargin(Sheet.LeftMargin,( double ) 0.1 );// 页边距(左) sheet.setMargin(Sheet.RightMargin,( double ) 0.1 );// 页边距(右) sheet.setMargin(Sheet.TopMargin,( double ) 0.5 );// 页边距(上) excelReportBuilder.writeFile(workbook, location); } @SuppressWarnings("unchecked") private void generateOtherFile(String extension, ReportTitle reportTitle, List> reportInfos, int rowSpace, String fileName, String interceptorName) throws Exception { FileOutputStream out = new FileOutputStream(fileName); try { for (Map map : reportInfos) { String type = (String) map.get("type"); ReportBuilder builder = this.getReportBuilder(extension); Assert.notNull(builder, "ReportBuilder is null."); if (SupportWidget.grid.name().equals(type)) { Map grid = (Map) map.get("grid"); ReportGrid report = commonReportGenerater.generateReportGridModel(grid, interceptorName); builder.execute(out, report); } } } finally { out.close(); } } public void afterPropertiesSet() throws Exception { String size = Configure.getString("bdf2.export.cacheSize"); if (StringUtils.isNotEmpty(size)) { rowAccessWindowSize = Integer.parseInt(size); } String fileLocation = ExportUtils.getFileStorePath(); File f = new File(fileLocation); if (!f.exists()) { f.mkdirs(); } builders = applicationContext.getBeansOfType(ReportBuilder.class).values(); } private Collection builders; private ApplicationContext applicationContext; public Collection getBuilders() { return builders; } public ReportBuilder getReportBuilder(String extension) { for (ReportBuilder builder : getBuilders()) { if (builder.support(extension)) { return builder; } } return null; } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }