如何使用Apache POI将标题添加到工作簿中的多个工作表

我已经使用Apache POI创build了一个批量报告。 我需要知道如何将标题添加到两个表。 我使用了getHeader(),但为两张纸张添加了相同的标题,而且我需要为两张纸张添加不同的标题。 我的代码如下。

Excel作家:

public class ExcelWriter { Logger log = Logger.getLogger(ExcelWriter.class.getName()); private HSSFWorkbook excel; public ExcelWriter() { excel = new HSSFWorkbook(); } public HSSFWorkbook getWorkbook() { return excel; } public void writeExcelFile(String filename, String[] columns, Object[][] data, HSSFCellStyle[] styles, HSSFCellStyle columnsStyle, String[] header, String[] footer) throws IOException { FileOutputStream out = new FileOutputStream(filename); HSSFSheet sheet = excel.createSheet("Daily Screening"); HSSFSheet sheet1 = excel.createSheet("Parcel Return"); int numHeaderRows = header.length; createHeader(sheet,header,columns.length, 0); createColumnHeaderRow(sheet,columns,numHeaderRows,columnsStyle); int rowCtr1 = numHeaderRows; for( int i = 0; i < data.length; i++) { if (i > data.length -2) ++rowCtr1; else rowCtr1 = rowCtr1 + 2; createRow(sheet, data[i], rowCtr1, styles); } int totalRows = rowCtr1 + 1; createHeader(sheet1,footer,columns.length, totalRows); excel.write(out); out.close(); } private void createHeader(HSSFSheet sheet1, String[] header, int columns, int rowNum) { for( int i = 0; i < header.length ; i++ ) { HSSFRow row = sheet1.createRow(i + rowNum); HSSFCell cell = row.createCell((short) 0); String text = header[i]; cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setCellValue(text); HSSFCellStyle style = excel.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); HSSFFont arialBoldFont = excel.createFont(); arialBoldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); arialBoldFont.setFontName("Arial"); arialBoldFont.setFontHeightInPoints((short) 12); style.setFont(arialBoldFont); if (!isEmpty(header[i]) && rowNum < 1) { style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); } cell.setCellStyle(style); sheet1.addMergedRegion( new Region(i+rowNum,(short)0,i+rowNum,(short)(columns-1)) ); } } private HSSFRow createColumnHeaderRow(HSSFSheet sheet, Object[] values, int rowNum, HSSFCellStyle style) { HSSFCellStyle[] styles = new HSSFCellStyle[values.length]; for( int i = 0; i < values.length; i++ ) { styles[i] = style; } return createRow(sheet,values,rowNum,styles); } private HSSFRow createRow(HSSFSheet sheet1, Object[] values, int rowNum, HSSFCellStyle[] styles) { HSSFRow row = sheet1.createRow(rowNum); for( int i = 0; i < values.length; i++ ) { HSSFCell cell = row.createCell((short) i); cell.setCellStyle(styles[i]); try{ Object o = values[i]; if( o instanceof String ) { String text = String.valueOf(o); cell.setCellValue(text); cell.setCellType(HSSFCell.CELL_TYPE_STRING); } else if (o instanceof Double) { Double d = (Double) o; cell.setCellValue(d.doubleValue()); cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); } else if (o instanceof Integer) { Integer in = (Integer)o; cell.setCellValue(in.intValue()); } else if (o instanceof Long) { Long l = (Long)o; cell.setCellValue(l.longValue()); cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); } else if( o != null ) { String text = String.valueOf(o); cell.setCellValue(text); cell.setCellType(HSSFCell.CELL_TYPE_STRING); } } catch(Exception e) { log.error(e.getMessage()); } } return row; } public boolean isEmpty(String str) { if(str.equals(null) || str.equals("")) return true; else return false; } 

}

包含页眉,页脚和列的报告生成器:

 public class SummaryReportGenerator extends ReportGenerator { Logger log = Logger.getLogger(SummaryReportGenerator.class.getName()); public SummaryReportGenerator(String reportDir, String filename) { super( reportDir + filename + ".xls", reportDir + filename + ".pdf"); } public String[] getColumnNames() { String[] columnNames = {"ISC\nCode", "Total\nParcels", "Total\nParcel Hit\n Count", "Filter Hit\n%", "Unanalyzed\nCount", "Unanalyzed\n%", "Name\nMatch\nCount", "Name\nMatch\n%", "Pended\nCount", "Pended\n%", "E 1 Sanction\nCountries\nCount", "E 1 Sanction\nCountries\n%", "Greater\nthat\n$2500\nCount", "Greater\nthat\n$2500\n%", "YTD\nTotal Hit\nCount", "YTD\nLong Term\nPending", "YTD\nLong Term\n%"}; return columnNames; } public HSSFCellStyle getColumnsStyle(HSSFWorkbook wrkbk) { HSSFCellStyle style = wrkbk.createCellStyle(); style.setWrapText(true); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); HSSFFont timesBoldFont = wrkbk.createFont(); timesBoldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); timesBoldFont.setFontName("Arial"); style.setFont(timesBoldFont); return style; } public Object[][] getData(Map map) { int rows = map.size();// + 1 + // 1 blank row 1; // 1 row for the grand total; int cols = getColumnNames().length; Object[][] data = new Object[rows][cols]; int row = 0; for (int i=0; i < map.size(); i++ ){ try{ SummaryBean bean = (SummaryBean)map.get(new Integer(i)); data[row][0] = bean.getIscCode(); data[row][1] = new Long(bean.getTotalParcelCtr()); data[row][2] = new Integer(bean.getTotalFilterHitCtr()); data[row][3] = bean.getFilterHitPrctg(); data[row][4] = new Integer(bean.getPendedHitCtr()); data[row][5] = bean.getPendedHitPrctg(); data[row][6] = new Integer(bean.getTrueHitCtr()); data[row][7] = new Integer(bean.getRetiredHitCtr()); data[row][8] = new Integer(bean.getSanctCntryCtr()); data[row][9] = new Integer(bean.getC25Ctr()); data[row][10] = new Integer(bean.getCnmCtr()); data[row][11] = new Integer(bean.getCndCtr()); data[row][12] = new Integer(bean.getCnlCtr()); data[row][13] = new Integer(bean.getCneCtr()); data[row][14] = new Integer(bean.getVndCtr()); data[row][15] = new Integer(bean.getCilCtr()); data[row][16] = new Integer(bean.getHndCtr()); data[row][17] = new Integer(bean.getCnrCtr()); ++row; } catch(Exception e) { log.error(e.getMessage()); } } return data; } public String[] getHeader(String startDate, String endDate) { Date today = new Date(); String reportDateFormat = Utils.formatDateTime(today, "MM/dd/yyyyHH.mm.ss"); String nowStr = Utils.now(reportDateFormat); String[] header = {"","EXCS Daily Screening Summary Report ","", "for transactions processed for the calendar date range", "from " + startDate + " to " + endDate, "Report created on " + nowStr.substring(0,10)+ " at " + nowStr.substring(10)}; return header; } public HSSFCellStyle[] getStyles(HSSFWorkbook wrkbk) { int columnSize = getColumnNames().length; HSSFCellStyle[] styles = new HSSFCellStyle[columnSize]; HSSFDataFormat format = wrkbk.createDataFormat(); for (int i=0; i < columnSize; i++){ styles[i] = wrkbk.createCellStyle(); if (i == 0){ styles[i].setAlignment(HSSFCellStyle.ALIGN_LEFT); }else{ styles[i].setAlignment(HSSFCellStyle.ALIGN_RIGHT); } if (i == 1 || i == 2){ styles[i].setDataFormat(format.getFormat("#,###,##0")); } HSSFFont timesFont = wrkbk.createFont(); timesFont.setFontName("Arial"); styles[i].setFont(timesFont); } return styles; } public String[] getFooter() { String[] header = {"","Parcel Return Reason Code Reference","", "DPM = Sender and/or recipient matches denied party", "HND = Humanitarian exception not declared", "CNM = Content not mailable under export laws", "VND = Value of content not declared", "CNR = Customer non-response", "C25 = Content Value greater than $2500", "CIL = Invalid license", "C30 = More than one parcel in a calendar month", "CNL = Content description not legible", "CNE = Address on mailpiece not in English", "RFN = Requires full sender and addressee names", "DGS = Dangerous goods", "R29 = RE-used 2976 or 2976A", "ANE = PS Form 2976 or 2976A not in English", "ICF = Incorrect Customs Declaration Form used", "DPR = Declaration of purpose required", "ITN = Internal Transaction Number (ITN), Export Exception/Exclusion Legend (ELL), or Proof of Filing Citation (PFC) is required", "OTH = Other","",}; return header; } 

}

报告生成器抽象类

 public void generateExcelReport(Map map, String startDate, String endDate) throws IOException { ExcelWriter writer = new ExcelWriter(); writer.writeExcelFile( getXlsFilename(), getColumnNames(), getData(map), getStyles(writer.getWorkbook()), getColumnsStyle(writer.getWorkbook()), getHeader(startDate, endDate), getFooter()); 

报表驱动:

 public class ReportDriver { static Logger log = Logger.getLogger(ReportDriver.class.getName()); public static void main (String args[]){ if (args.length == 0) { log.error("Usage - ReportDriver [Day|Week|Month|Year]"); System.exit(1); } String reportPeriod = args[0]; log.info("Begin Prior " + reportPeriod + " Report"); String dir = "c:\\excsbatch\\report\\"; Dates dates = new Dates(); dates.setDates(reportPeriod); String startDate = dates.getStartDate(); String endDate = dates.getEndDate(); DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); Calendar cal = Calendar.getInstance(); String timeStamp = dateFormat.format(cal.getTime()); String fileName = "prior" + reportPeriod + "Report" + timeStamp; SummaryDAO dao = new SummaryDAO(); Map map = dao.extractData(startDate, endDate); SummaryReportGenerator report = new SummaryReportGenerator(dir, fileName); try { report.generateExcelReport(map, startDate, endDate); } catch(Exception e) { log.error(e.getMessage()); System.exit(2); } log.info("End Prior " + reportPeriod + " Report"); } 

}