/** * 罫線スタイルの<b>CellStyle</b>を生成 1行のみ描画する * * @param workbook ワークブック * @param sheet シート * @param nRow 行 * @param nColumn 列 * @param isBold 太字フラグ * @param fontSize 文字サイズ * @param fontHeight 行高 */ public static void setCellStyleForLabel( XSSFWorkbook workbook, XSSFSheet sheet, int nRow, int nColumn, boolean isBold, short fontSize, float fontHeight) { assert sheet != null; // style設定 XSSFCellStyle style = workbook.createCellStyle(); XSSFFont font = workbook.createFont(); if (isBold) { font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); // 文字太字 } font.setFontHeightInPoints((short) fontSize); // 文字サイズ font.setFontName(DEFAULT_FONT_NAME); style.setFont(font); // 文字太字 と 文字サイズ style.setAlignment(CellStyle.ALIGN_GENERAL); // 水平方向の標準 style.setVerticalAlignment(CellStyle.VERTICAL_TOP); // 垂直方向の上詰め style.setWrapText(true); // 折り返して全体を表示する // セルに罫線を描画 XSSFRow row = getRowAnyway(sheet, nRow); XSSFCell cell = getCellAnyway(row, nColumn); cell.setCellStyle(style); row.setHeightInPoints(fontHeight); // 行高設定 }
/** * 指定行を0で埋める * * @param sheet 編集対象シート * @param nRow 行番号 * @param nStartColumn 開始列番号 * @param nEndColumn 終了列番号 */ public static void setZero(XSSFSheet sheet, int nRow, int nStartColumn, int nEndColumn) { XSSFRow row = getRowAnyway(sheet, nRow); for (int nIndex = nStartColumn; nIndex <= nEndColumn; nIndex++) { XSSFCell cell = getCellAnyway(row, nIndex); cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue((double) 0); } }
/** * 全てのシートの先頭セルにフォーカスをあてる * * @param workbook ワークブック */ public static void setFocusFistCell(XSSFWorkbook workbook) { assert workbook != null; for (int nIndex = 0; nIndex < workbook.getNumberOfSheets(); nIndex++) { XSSFSheet sheet = workbook.getSheetAt(nIndex); XSSFCell cell = getFirstCell(sheet); assert cell != null; cell.setAsActiveCell(); } }
/** * セルの縮小して全体を表示する * * @param nRow 行データ * @return 有効列数 */ public static void setShrinkToFitForCell(XSSFWorkbook wb, XSSFSheet sheet, int nRow, int nCol) { XSSFRow row = OoxmlUtil.getRowAnyway(sheet, nRow); XSSFCell cell = OoxmlUtil.getCellAnyway(row, nCol); CellStyle styletmp = cell.getCellStyle(); CellStyle newStyletmp = wb.createCellStyle(); newStyletmp.cloneStyleFrom(styletmp); newStyletmp.setWrapText(false); // 折り返して全体を表示する newStyletmp.setShrinkToFit(true); // 縮小して全体を表示する cell.setCellStyle(newStyletmp); }
/** * セルの値を取得する * * @param row 行データ * @param nColumn 列番号 * @return セルの値 */ public static Object getData(XSSFRow row, int nColumn) { if (row != null) { XSSFCell cell = row.getCell(nColumn); if (cell != null) { if (XSSFCell.CELL_TYPE_NUMERIC == cell.getCellType()) { return cell.getNumericCellValue(); } else if (XSSFCell.CELL_TYPE_STRING == cell.getCellType()) { return cell.getStringCellValue(); } } } return null; }
/** * 列方向のセルの値を合算する * * @param sheet 編集対象シート * @param nColumn 行番号 * @param nStartRow 開始列番号 * @param nEndRow 終了列番号 * @return 合算値 */ public static int sumColumn(XSSFSheet sheet, int nColumn, int nStartRow, int nEndRow) { int sum = 0; for (int nIndex = nStartRow; nIndex <= nEndRow; nIndex++) { XSSFRow row = sheet.getRow(nIndex); assert row != null; XSSFCell cell = row.getCell(nColumn); assert cell != null; if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) { sum += cell.getNumericCellValue(); } } return sum; }
/** * 罫線スタイルの<b>CellStyle</b>を生成 セル結合 * * @param workbook ワークブック * @param sheet シート * @param nRowStart 開始行 * @param nRowEnd 終了行 * @param nColumnStart 開始列 * @param nColumnEnd 終了列 * @param style 罫線style */ public static void setMerger( XSSFWorkbook workbook, XSSFSheet sheet, int nRowStart, int nRowEnd, int nColumnStart, int nColumnEnd, XSSFCellStyle style) { assert sheet != null; sheet.addMergedRegion(new CellRangeAddress(nRowStart, nRowEnd, nColumnStart, nColumnEnd)); XSSFRow row = getRowAnyway(sheet, nRowStart); XSSFCell cell = getCellAnyway(row, nColumnStart); cell.setCellStyle(style); }
/** * 指定範囲にセルを新規作成 * * @param sheet シート * @param startRow 開始行番号 * @param endRow 終了行番号 * @param startColumn 開始列番号 * @param endColumn 終了列番号 * @param style セルスタイル */ public static void setStyle( XSSFSheet sheet, int startRow, int endRow, int startColumn, int endColumn, XSSFCellStyle style) { for (int nRow = startRow; nRow <= endRow; nRow++) { XSSFRow row = getRowAnyway(sheet, nRow); for (int nColumn = startColumn; nColumn <= endColumn; nColumn++) { XSSFCell cell = getCellAnyway(row, nColumn); cell.setCellStyle(style); } } }
/** * 上線は太線のセル行を探す * * @param nRow 行データ * @return 有効列数 */ public static int getRowForBold(XSSFSheet sheet, int nRow, int pageRowNum) { int nRowIndex = nRow; for (nRowIndex = nRow; nRowIndex > (nRow - pageRowNum); nRow--) { XSSFRow row = OoxmlUtil.getRowAnyway(sheet, nRow); if (row != null) { XSSFCell cell = row.getCell(0); XSSFCellStyle styletmp = cell.getCellStyle(); short borderTopnum = styletmp.getBorderTop(); short borderBold = XSSFCellStyle.BORDER_MEDIUM; if (styletmp.getBorderTop() == (XSSFCellStyle.BORDER_MEDIUM)) { break; } } } return nRowIndex; }
/** * ハイパーリンクの設定 * * @param sheet シート * @param nRow 対象行番号 * @param nColumn 対象列番号 * @param value ハイパーリンクテキスト * @param url ハイパーリンク先URL */ public static void setHyperLink( XSSFSheet sheet, int nRow, int nColumn, String value, String url) { assert sheet != null; XSSFWorkbook workbook = sheet.getWorkbook(); CreationHelper helper = workbook.getCreationHelper(); Hyperlink hyperlink = helper.createHyperlink(Hyperlink.LINK_URL); hyperlink.setAddress(url); XSSFRow row = getRowAnyway(sheet, nRow); XSSFCell cell = getCellAnyway(row, nColumn); cell.setCellValue(value); cell.setHyperlink(hyperlink); // ハイパーリンクテキストの装飾 XSSFFont font = workbook.createFont(); XSSFCellStyle style = workbook.createCellStyle(); // font.setColor(new XSSFColor(new Color(0, 0, 255))); font.setUnderline(XSSFFont.U_SINGLE); style.setFont(font); cell.setCellStyle(style); }
/** * 罫線スタイルの<b>CellStyle</b>を生成 1行のみ描画する * * @param workbook ワークブック * @param sheet シート * @param nRowStart 開始行 * @param nRowEnd 終了行 * @param nColumnStart 開始列 * @param nColumnEnd 終了列 * @param isBorder 罫線描画フラグ * @param style 罫線style */ public static void setRowDataCellStyle( XSSFWorkbook workbook, XSSFSheet sheet, int nRowStart, int nRowEnd, int nColumnStart, int nColumnEnd, boolean isBorder, XSSFCellStyle style) { assert sheet != null; // Range内のすべてセルに罫線を描画 for (int rIndex = nRowStart; rIndex <= nRowEnd; rIndex++) { XSSFRow row = getRowAnyway(sheet, rIndex); for (int cIndex = nColumnStart; cIndex <= nColumnEnd; cIndex++) { XSSFCell cell = getCellAnyway(row, cIndex); cell.setCellStyle(style); } } }
private void generateExcelDoc(String docName) throws FileNotFoundException, IOException { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet overall = workbook.createSheet("Overall"); XSSFRow row = overall.createRow(0); XSSFCellStyle topStyle = workbook.createCellStyle(); topStyle.setAlignment(CellStyle.ALIGN_CENTER); XSSFCell theme = row.createCell(0); theme.setCellValue("Theme"); overall.autoSizeColumn(0); XSSFCell occurs = row.createCell(1); occurs.setCellValue("Occurrences"); overall.autoSizeColumn(1); XSSFCell prev = row.createCell(2); prev.setCellValue("Prevalence"); overall.autoSizeColumn(2); theme.setCellStyle(topStyle); occurs.setCellStyle(topStyle); prev.setCellStyle(topStyle); for (int i = 0; i < themes.size(); i++) { XSSFRow r = overall.createRow((i + 1)); XSSFCell c = r.createCell(0); c.setCellValue(themes.get(i).getName()); XSSFCell c1 = r.createCell(1); c1.setCellValue(themes.get(i).getTotalOccurs()); XSSFCell c2 = r.createCell(2); c2.setCellValue(calculatePrevalence(themes.get(i).getTotalOccurs(), lineCount)); } // This could be done in the previous loop but since we don't need // indices as much, we may as well use the cleaner for each loop for (Theme t : themes) { XSSFSheet themeSheet = workbook.createSheet(t.getName()); XSSFRow row1 = themeSheet.createRow(0); XSSFCell keyword = row1.createCell(0); keyword.setCellValue("Keyword"); keyword.setCellStyle(topStyle); XSSFCell occ = row1.createCell(1); occ.setCellValue("Occurrences"); occ.setCellStyle(topStyle); XSSFCell themePrev = row1.createCell(2); themePrev.setCellValue("Prevalence"); themePrev.setCellStyle(topStyle); for (int i = 0; i < t.getKeywords().size(); i++) { Keyword k = t.getKeywords().get(i); XSSFRow r = themeSheet.createRow((i + 1)); XSSFCell c = r.createCell(0); c.setCellValue(k.getName()); XSSFCell c1 = r.createCell(1); c1.setCellValue(k.getNumOccurs()); XSSFCell c2 = r.createCell(2); c2.setCellValue(calculatePrevalence(k.getNumOccurs(), t.getTotalOccurs())); } } FileOutputStream output = new FileOutputStream(docName); workbook.write(output); output.close(); }
/** * セルに文字列を出力する * * @param cell 対象セル * @param object 出力データ * @param style セルスタイル * @param zeroValue 値が0の時に設定する値 */ private static void setData(XSSFCell cell, Object object, XSSFCellStyle style, String zeroValue) { if (style != null) { cell.setCellStyle(style); } if (object instanceof String) { cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue((String) object); } else if (object instanceof Integer) { Integer integer = (Integer) object; if (0 == integer) { cell.setCellType(XSSFCell.CELL_TYPE_STRING); cell.setCellValue(zeroValue); } else { cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue((Integer) object); } } else if (object instanceof Double) { cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); if (Double.isNaN((Double) object)) { cell.setCellValue(zeroValue); } else { Double value = (Double) object; if (0 == value.compareTo((Double) 0.0)) { cell.setCellValue(zeroValue); } else { cell.setCellValue((Double) object); } } } }
/** * 指定セルのセルスタイルを取得 * * @param sheet シート * @param nRow 行番号 * @param nColumn 列番号 * @return <b>CellStyle</b> */ public static XSSFCellStyle getCellStyle(XSSFSheet sheet, int nRow, int nColumn) { assert sheet != null; XSSFRow row = getRowAnyway(sheet, nRow); XSSFCell cell = getCellAnyway(row, nColumn); return cell.getCellStyle(); }
/** * 罫線スタイルの<b>CellStyle</b>を生成 四角の範囲に周囲太線、中は細線を描画する * * @param workbook ワークブック * @param sheet シート * @param nRowStart 開始行 * @param nRowEnd 終了行 * @param nColumnStart 開始列 * @param nColumnEnd 終了列 * @param isBorder 罫線描画フラグ * @param styleMap 罫線style */ public static void setTableDataCellStyle( XSSFWorkbook workbook, XSSFSheet sheet, int nRowStart, int nRowEnd, int nColumnStart, int nColumnEnd, boolean isBorder, Map<String, XSSFCellStyle> styleMap) { assert sheet != null; // Range内のすべてセルに罫線を描画 for (int rIndex = nRowStart; rIndex <= nRowEnd; rIndex++) { XSSFRow row = getRowAnyway(sheet, rIndex); for (int cIndex = nColumnStart; cIndex <= nColumnEnd; cIndex++) { XSSFCell cell = getCellAnyway(row, cIndex); cell.setCellStyle(styleMap.get("normal")); } } // 初行のTopのみ太罫線 XSSFRow row = getRowAnyway(sheet, nRowStart); XSSFCell cell = getCellAnyway(row, nColumnStart); cell.setCellStyle(styleMap.get("isTopAndLeft")); for (int cIndex = nColumnStart + 1; cIndex < nColumnEnd; cIndex++) { cell = getCellAnyway(row, cIndex); cell.setCellStyle(styleMap.get("isTop")); } cell = getCellAnyway(row, nColumnEnd); cell.setCellStyle(styleMap.get("isTopAndRight")); // 間の行 for (int cIndexCenter = nRowStart + 1; cIndexCenter < nRowEnd; cIndexCenter++) { row = getRowAnyway(sheet, cIndexCenter); cell = getCellAnyway(row, nColumnStart); cell.setCellStyle(styleMap.get("isLeft")); cell = getCellAnyway(row, nColumnEnd); cell.setCellStyle(styleMap.get("isRight")); } // 最後の行のBottomのみ太罫線 XSSFRow rowEnd = getRowAnyway(sheet, nRowEnd); cell = getCellAnyway(rowEnd, nColumnStart); cell.setCellStyle(styleMap.get("isBottomAndLeft")); for (int cIndex = nColumnStart + 1; cIndex < nColumnEnd; cIndex++) { cell = getCellAnyway(rowEnd, cIndex); cell.setCellStyle(styleMap.get("isBottom")); } cell = getCellAnyway(rowEnd, nColumnEnd); cell.setCellStyle(styleMap.get("isBottomAndRight")); // CellRangeAddress region=new // CellRangeAddress(nRowStart,nRowEnd,nColumnStart,nColumnEnd); // short border=XSSFCellStyle.BORDER_MEDIUM;//太罫線 // RegionUtil.setBorderTop(border,region,sheet,workbook); // RegionUtil.setBorderBottom(border,region,sheet,workbook); // RegionUtil.setBorderLeft(border, region, sheet, workbook); // RegionUtil.setBorderRight(border, region, sheet, workbook); }