1、使用
String toFileName = "E:\\sheet1.xlsx"; String fromFileName = "E:\\sheet2.xlsx"; MemoryToExcel memoryToExcel = new MemoryToExcel(); memoryToExcel.mergeExcel(toFileName, 1, fromFileName, 0); // String fileName = "E:\\test.xlsx"; // String sheetName = "Test"; // // Map<Integer, FrameworkEnums.EnumDBDataType> dataTypeByColumn = // new HashMap<Integer, EnumDBDataType>(); // dataTypeByColumn.put(1, EnumDBDataType.Int); // dataTypeByColumn.put(2, EnumDBDataType.Int); // dataTypeByColumn.put(3, EnumDBDataType.Date); // dataTypeByColumn.put(4, EnumDBDataType.DateTime); // // Map<Integer, String> dataFormatByColumn = new HashMap<Integer, // String>(); // //dataFormatByColumn.put(2, "0.00%"); // dataFormatByColumn.put(3, "yyyy-mm-dd"); // dataFormatByColumn.put(4, "yyyy-mm-dd hh:mm:ss"); // // Object[][] data = new Object[100][10]; // // for (int i = 0; i < 100; i++) { // for (int j = 0; j < 10; j++) { // if (j == 1) { // data[i][j] = i; // } else if (j == 2) { // data[i][j] = i + 0.6; // } else if (j == 3) { // data[i][j] = new Date(); // } else if (j == 4) { // data[i][j] = new Date(); // } else { // data[i][j] = "" + i + "+" + j; // } // } // } // // MemoryToExcel memoryToExcel = new MemoryToExcel(); // memoryToExcel.setFileName(fileName); // memoryToExcel.setSheetName(sheetName); // memoryToExcel.setTopSkipRows(2); // memoryToExcel.setSourceData(data); // memoryToExcel.setDataTypeByColumn(dataTypeByColumn); // memoryToExcel.setDataFormatByColumn(dataFormatByColumn); // memoryToExcel.start(); // System.out.println("写数据结束!"); // // memoryToExcel.setWrapCellData(0, 0, 0, "报表测试"); // for (int i = 0; i < 10; i++) { // memoryToExcel.setWrapCellData(0, 1, i, "累计\r\n外呼量" + i); // } // System.out.println("设置标题和列名结束!"); // memoryToExcel.setColumnWidth(0, 0, 9, 10); // memoryToExcel.setRowHeight(0, 1, 2, (short)15); // memoryToExcel.setAutoFit(0, 0, 2); // System.out.println("设置自适应结束!"); // Color color = new Color(54, 201, 201); // memoryToExcel.setBackgroundColor(0, 1, 1, 0, 10, color); // System.out.println("设置背景色结束!"); // // memoryToExcel.setMerge(0, 0, 0, 0, 9); // System.out.println("设置单元格合并结束!"); // // Font font = new Font("宋体", Font.BOLD, 12); // color = new Color(255, 0, 0); // memoryToExcel.setFont(0, 0, 1, 0, 1, font, color); // font = new Font("宋体", Font.BOLD, 10); // memoryToExcel.setFont(0, 1, 1, 0, 10, font); // font = new Font("宋体", Font.PLAIN, 9); // memoryToExcel.setFont(0, 2, 100, 0, 10, font); // System.out.println("设置字体结束!"); // // memoryToExcel.setBorder(0, 0, 100 + 2, 0, 10); // System.out.println("设置Border结束!"); // // memoryToExcel.setAlignment(0, 0, 100 + 2, 0, 10, // (short) 2, (short) 1); // System.out.println("设置对齐方式结束!"); // System.out.println("导出成功"); } catch (Exception e) { System.out.println(String.format("导出失败,%s", e.getMessage())); } System.exit(0);
2、核心代码
package nankang.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class MemoryToExcel { private String m_FileName; private String m_SheetName; private int m_TopSkipRows = 0; private int m_TopSkipCols = 0; private int m_DataType2SartRow = 0; private Map<Integer, FrameworkEnums.EnumDBDataType> m_DataTypeByColumn = new HashMap<Integer, FrameworkEnums.EnumDBDataType>(); private Map<Integer, String> m_DataFormatByColumn = new HashMap<Integer, String>(); private Map<Integer, FrameworkEnums.EnumDBDataType> m_DataTypeByColumn2 = new HashMap<Integer, FrameworkEnums.EnumDBDataType>(); private Map<Integer, String> m_DataFormatByColumn2 = new HashMap<Integer, String>(); private Object[][] m_SourceData; /** * 返回 文件名称 * * @return 文件名称 */ public String getFileName() { return m_FileName; } /** * 设置文件名 * * @param fileName * 文件名称 */ public void setFileName(String fileName) { m_FileName = fileName; } public String getSheetName() { return m_SheetName; } public void setSheetName(String sheetName) { m_SheetName = sheetName; } public int getTopSkipRows() { return m_TopSkipRows; } public void setTopSkipRows(int topSkipRows) { m_TopSkipRows = topSkipRows; } public int getTopSkipCols() { return m_TopSkipCols; } public void setTopSkipCols(int topSkipCols) { m_TopSkipCols = topSkipCols; } public int getDataType2SartRow() { return m_DataType2SartRow; } public void setDataType2SartRow(int mDataType2SartRow) { m_DataType2SartRow = mDataType2SartRow; } public Map<Integer, FrameworkEnums.EnumDBDataType> getDataTypeByColumn() { return m_DataTypeByColumn; } public void setDataTypeByColumn( Map<Integer, FrameworkEnums.EnumDBDataType> dataTypeByColumn) { m_DataTypeByColumn = dataTypeByColumn; } public Map<Integer, String> getDataFormatByColumn() { return m_DataFormatByColumn; } public void setDataFormatByColumn(Map<Integer, String> dataFormatByColumn) { m_DataFormatByColumn = dataFormatByColumn; } public Map<Integer, FrameworkEnums.EnumDBDataType> getDataTypeByColumn2() { return m_DataTypeByColumn2; } public void setDataTypeByColumn2( Map<Integer, FrameworkEnums.EnumDBDataType> mDataTypeByColumn2) { m_DataTypeByColumn2 = mDataTypeByColumn2; } public Map<Integer, String> getDataFormatByColumn2() { return m_DataFormatByColumn2; } public void setDataFormatByColumn2(Map<Integer, String> mDataFormatByColumn2) { m_DataFormatByColumn2 = mDataFormatByColumn2; } public Object[][] getSourceData() { return m_SourceData; } public void setSourceData(Object[][] sourceData) { m_SourceData = sourceData; } /** * 生成Excel文件 * * @throws Exception */ public void start() throws Exception { try { // 用SXSSFWorkbook设置缓存数据,处理批量写入 Workbook workbook = new SXSSFWorkbook(1000); Sheet sheet = null; if (m_SheetName.isEmpty()) { sheet = workbook.createSheet(); } else { sheet = workbook.createSheet(m_SheetName); } // 写入数据 for (int rIndex = 0; rIndex < m_SourceData.length; rIndex++) { int dataRIndex = rIndex + m_TopSkipRows; Row row = sheet.createRow(dataRIndex); for (int cIndex = 0; cIndex < m_SourceData[rIndex].length; cIndex++) { int dataCIndex = cIndex + m_TopSkipCols; Map<Integer, FrameworkEnums.EnumDBDataType> dataTypeByColumn = m_DataTypeByColumn; Map<Integer, String> dataFormatByColumn = m_DataFormatByColumn; if ((m_DataType2SartRow > 0) && (dataRIndex >= m_DataType2SartRow)) { dataTypeByColumn = m_DataTypeByColumn2; dataFormatByColumn = m_DataFormatByColumn2; } Cell cell = row.createCell(dataCIndex); Object value = m_SourceData[rIndex][cIndex]; if (value == null) { continue; } // 设置但单元格值样式 String dataFormat = dataFormatByColumn.get(dataCIndex); if ((dataFormat != null) && ("".equals(dataFormat) == false)) { CellStyle style = workbook.createCellStyle(); DataFormat format = workbook.createDataFormat(); style.setDataFormat(format.getFormat(dataFormat)); cell.setCellStyle(style); } // 设置单元格的值和值类型 FrameworkEnums.EnumDBDataType dataType = dataTypeByColumn .get(dataCIndex); if (dataType != null) { switch (dataType) { case AnsiStringFixedLength: case AnsiString: case String: case StringFixedLength: cell.setCellValue(value.toString()); break; case Int: int intVal = 0; try { intVal = Integer.parseInt(value.toString()); } catch (Exception e) { try { double tmpVal = Double.parseDouble(value .toString()); intVal = (int) tmpVal; } catch (Exception ex) { String .format( "转换成int失败,Row:%s,Column:%s,Message:%s!", rIndex, cIndex, e .getMessage()); } } cell.setCellValue(intVal); break; case Double: double doubleVal = 0.0d; try { doubleVal = Double .parseDouble(value.toString()); } catch (Exception e) { throw new Exception( String .format( "转换成double失败,Row:%s,Column:%s,Message:%s!", rIndex, cIndex, e .getMessage())); } cell.setCellValue(doubleVal); break; case Float: float floatVal = 0.0f; try { floatVal = Float.parseFloat(value.toString()); } catch (Exception e) { throw new Exception( String .format( "转换成float失败,Row:%s,Column:%s,Message:%s!", rIndex, cIndex, e .getMessage())); } cell.setCellValue(floatVal); break; case Long: long longVal = 0l; try { longVal = Long.parseLong(value.toString()); } catch (Exception e) { throw new Exception( String .format( "转换成long失败,Row:%s,Column:%s,Message:%s!", rIndex, cIndex, e .getMessage())); } cell.setCellValue(longVal); break; case Short: short shortVal = (short) 0; try { shortVal = Short.parseShort(value.toString()); } catch (Exception e) { throw new Exception( String .format( "转换成short失败,Row:%s,Column:%s,Message:%s!", rIndex, cIndex, e .getMessage())); } cell.setCellValue(shortVal); break; case Date: SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyy-MM-dd"); Date dateVal = null; try { String dateString = simpleDateFormat .format(value); dateVal = simpleDateFormat.parse(dateString); } catch (Exception e) { throw new Exception( String .format( "转换成Date失败,Row:%s,Column:%s,Message:%s!", rIndex, cIndex, e .getMessage())); } cell.setCellValue(dateVal); break; case DateTime: case FullDateTime: simpleDateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); dateVal = null; try { String dateString = simpleDateFormat .format(value); dateVal = simpleDateFormat.parse(dateString); } catch (Exception e) { throw new Exception( String .format( "转换成DateTime失败,Row:%s,Column:%s,Message:%s!", rIndex, cIndex, e .getMessage())); } cell.setCellValue(dateVal); break; default: cell.setCellValue(value.toString()); break; } } else { cell.setCellValue(value.toString()); } } } // 写入文件 OutputStream outputStream = new FileOutputStream(m_FileName); workbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("start:%s", e.getMessage())); } } /** * 设置单元格的值(先执行Start方法) * * @param sheetIndex * Sheet的索引,从0开始 * @param row * 行索引 * @param col * 列索引 * @param value * 值(暂时只支持字符串) * @throws Exception */ public void setCellData(int sheetIndex, int row, int col, String value) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Sheet sheet = workbook.getSheetAt(sheetIndex); Row mRow = sheet.getRow(row); if (mRow == null) { mRow = sheet.createRow(row); } Cell mCell = mRow.createCell(col); mCell.setCellValue(value); // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setCellData:%s", e.getMessage())); } } /** * 设置单元格的值,支持/n自动换行(先执行Start方法) * * @param sheetIndex * Sheet的索引,从0开始 * @param row * 行索引 * @param col * 列索引 * @param value * 值(暂时只支持字符串) * @throws Exception */ public void setWrapCellData(int sheetIndex, int row, int col, String value) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Sheet sheet = workbook.getSheetAt(sheetIndex); Row mRow = sheet.getRow(row); if (mRow == null) { mRow = sheet.createRow(row); } Cell mCell = mRow.createCell(col); mCell.setCellValue(value); // 设置自动换行 CellStyle style = workbook.createCellStyle(); style.setWrapText(true); mCell.setCellStyle(style); // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setWrapCellData:%s", e .getMessage())); } } /** * 设置单元格数据的水平垂直对齐方式(先执行Start方法) * * @param sheetIndex * Sheet的索引,从0开始 * @param startRow * 开始行,从0开始 * @param rowNum * 行数 * @param startCol * 开始列,从0开始 * @param colNum * 列数 * @param alignment * 水平展示方式 ALIGN_GENERAL = 0 ALIGN_LEFT = 1 ALIGN_CENTER = 2 * ALIGN_RIGHT = 3 ALIGN_FILL = 4 ALIGN_JUSTIFY = 5 * ALIGN_CENTER_SELECTION = 6 * @param verticalAlignment * 竖直展示方式 VERTICAL_TOP = 0 VERTICAL_CENTER = 1 VERTICAL_BOTTOM = * 2 VERTICAL_JUSTIFY = 3 * @throws Exception */ public void setAlignment(int sheetIndex, int startRow, int rowNum, int startCol, int colNum, short alignment, short verticalAlignment) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Sheet sheet = workbook.getSheetAt(sheetIndex); // 设置单元格样式 for (int rIndex = startRow; rIndex < startRow + rowNum; rIndex++) { Row row = sheet.getRow(rIndex); if (row == null) { row = sheet.createRow(rIndex); } for (int cIndex = startCol; cIndex < startCol + colNum; cIndex++) { Cell cell = row.getCell(cIndex); if (cell == null) { cell = row.createCell(cIndex); } CellStyle style = cell.getCellStyle(); // 判断是否已经创建过 if (style.getIndex() == 0) { style = workbook.createCellStyle(); } style.setAlignment(alignment); style.setVerticalAlignment(verticalAlignment); cell.setCellStyle(style); } } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String .format("setAlignment:%s", e.getMessage())); } } /** * 设置单元格的字体及大小(先执行Start方法) * * @param sheetIndex * Excel索引,从0开始 * @param startRow * 开始行,从0开始 * @param rowNum * 设置的行数 * @param startCol * 开始列,从0开始 * @param colNum * 设置的列数 * @param font * 字体:TimesRoman, Courier, Arial等 风格:三个常量 lFont.PLAIN, Font.BOLD, * Font.ITALIC 字号:字的大小(磅数) 字体名称和大小 BOLDWEIGHT_NORMAL = 400; * BOLDWEIGHT_BOLD = 700 * @throws Exception */ public void setFont(int sheetIndex, int startRow, int rowNum, int startCol, int colNum, java.awt.Font font) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Font mFont = workbook.createFont(); mFont.setFontName(font.getFontName()); mFont.setFontHeightInPoints((short) font.getSize()); if (font.isBold() == true) { mFont.setBoldweight((short) 700); } else { mFont.setBoldweight((short) 400); } Sheet sheet = workbook.getSheetAt(sheetIndex); // 设置单元格样式 for (int rIndex = startRow; rIndex < startRow + rowNum; rIndex++) { Row row = sheet.getRow(rIndex); if (row == null) { row = sheet.createRow(rIndex); } for (int cIndex = startCol; cIndex < startCol + colNum; cIndex++) { Cell cell = row.getCell(cIndex); if (cell == null) { cell = row.createCell(cIndex); } CellStyle style = cell.getCellStyle(); // 判断是否已经创建过 if (style.getIndex() == 0) { style = workbook.createCellStyle(); } style.setFont(mFont); cell.setCellStyle(style); } } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setFont:%s", e.getMessage())); } } /** * 设置单元格的字体、大小、颜色(先执行Start方法) * * @param sheetIndex * Excel索引,从0开始 * @param startRow * 开始行,从0开始 * @param rowNum * 设置的行数 * @param startCol * 开始列,从0开始 * @param colNum * 设置的列数 * @param font * 字体:TimesRoman, Courier, Arial等 风格:三个常量 lFont.PLAIN, Font.BOLD, * Font.ITALIC 字号:字的大小(磅数) 字体名称和大小 BOLDWEIGHT_NORMAL = 400; * BOLDWEIGHT_BOLD = 700 * @param color * 颜色 new Color(54, 201, 201) * @throws Exception */ public void setFont(int sheetIndex, int startRow, int rowNum, int startCol, int colNum, java.awt.Font font, java.awt.Color color) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); XSSFFont mFont = workbook.createFont(); mFont.setFontName(font.getFontName()); mFont.setFontHeightInPoints((short) font.getSize()); mFont.setColor(new XSSFColor(color)); if (font.isBold() == true) { mFont.setBoldweight((short) 700); } else { mFont.setBoldweight((short) 400); } Sheet sheet = workbook.getSheetAt(sheetIndex); // 设置单元格样式 for (int rIndex = startRow; rIndex < startRow + rowNum; rIndex++) { Row row = sheet.getRow(rIndex); if (row == null) { row = sheet.createRow(rIndex); } for (int cIndex = startCol; cIndex < startCol + colNum; cIndex++) { Cell cell = row.getCell(cIndex); if (cell == null) { cell = row.createCell(cIndex); } CellStyle style = cell.getCellStyle(); // 判断是否已经创建过 if (style.getIndex() == 0) { style = workbook.createCellStyle(); } style.setFont(mFont); cell.setCellStyle(style); } } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setFont2:%s", e.getMessage())); } } /** * 设置背景色(先执行Start方法) * * @param sheetIndex * Sheet的索引,从0开始 * @param startRow * 开始行,从0开始 * @param rowNum * 行数 * @param startCol * 开始列,从0开始 * @param colNum * 列数 * @param color * 颜色 new Color(54, 201, 201) * @throws Exception */ public void setBackgroundColor(int sheetIndex, int startRow, int rowNum, int startCol, int colNum, java.awt.Color color) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Sheet sheet = workbook.getSheetAt(sheetIndex); // 设置单元格样式 for (int rIndex = startRow; rIndex < startRow + rowNum; rIndex++) { Row row = sheet.getRow(rIndex); if (row == null) { row = sheet.createRow(rIndex); } for (int cIndex = startCol; cIndex < startCol + colNum; cIndex++) { Cell cell = row.getCell(cIndex); if (cell == null) { cell = row.createCell(cIndex); } XSSFCellStyle style = (XSSFCellStyle) cell.getCellStyle(); // 判断是否已经创建过 if (style.getIndex() == 0) { style = workbook.createCellStyle(); } style.setFillForegroundColor(new XSSFColor(color)); style.setFillPattern(CellStyle.SOLID_FOREGROUND); cell.setCellStyle(style); } } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setBackgroudColor:%s", e .getMessage())); } } /** * 设置合并单元格(先执行Start方法) * * @param sheetIndex * Sheet的索引,从0开始 * @param firstRow * 开始行 * @param lastRow * 结束行 * @param firstCol * 开始列 * @param lastCol * 结束列 * @throws Exception */ public void setMerge(int sheetIndex, int firstRow, int lastRow, int firstCol, int lastCol) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Sheet sheet = workbook.getSheetAt(sheetIndex); sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setMerge:%s", e.getMessage())); } } /** * 设置单元格的边框(先执行Start方法) * * @param sheetIndex * Excel索引,从0开始 * @param startRow * 开始行,从0开始 * @param rowNum * 设置的行数 * @param startCol * 开始列,从0开始 * @param colNum * 需要设置的列数 * @throws Exception */ public void setBorder(int sheetIndex, int startRow, int rowNum, int startCol, int colNum) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Sheet sheet = workbook.getSheetAt(sheetIndex); // 设置单元格样式 for (int rIndex = startRow; rIndex < startRow + rowNum; rIndex++) { Row row = sheet.getRow(rIndex); if (row == null) { row = sheet.createRow(rIndex); } for (int cIndex = startCol; cIndex < startCol + colNum; cIndex++) { Cell cell = row.getCell(cIndex); if (cell == null) { cell = row.createCell(cIndex); } CellStyle style = cell.getCellStyle(); // 判断是否已经创建过 if (style.getIndex() == 0) { style = workbook.createCellStyle(); } style.setBorderBottom(CellStyle.BORDER_THIN); style.setBorderLeft(CellStyle.BORDER_THIN); style.setBorderRight(CellStyle.BORDER_THIN); style.setBorderTop(CellStyle.BORDER_THIN); cell.setCellStyle(style); } } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setBorder:%s", e.getMessage())); } } /** * 设置行的高度(先执行Start方法) 说明:与Excel不是很对应,请多设置几次高度值 * * @param sheetIndex * Excel索引,从0开始 * @param startRow * 开始行,从0开始 * @param rowNum * 行的数量 * @param height * 设置的高度 * @throws Exception */ public void setRowHeight(int sheetIndex, int startRow, int rowNum, short height) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); // 高度特殊处理 height = (short) (height * 20); Sheet sheet = workbook.getSheetAt(sheetIndex); for (int rIndex = startRow; rIndex < startRow + rowNum; rIndex++) { Row row = sheet.getRow(rIndex); if (row == null) { row = sheet.createRow(rIndex); } row.setHeight(height); } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setAutoFit:%s", e.getMessage())); } } /** * 设置列的宽度(先执行Start方法) 说明:与Excel不是很对应,请多设置几次宽度值 * * @param sheetIndex * Excel索引,从0开始 * @param startCol * 开始列,从0开始 * @param colNum * 列数 * @param width * 宽度 * @throws Exception */ public void setColumnWidth(int sheetIndex, int startCol, int colNum, int width) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); // 宽度特殊处理 width = width * 275; Sheet sheet = workbook.getSheetAt(sheetIndex); for (int cIndex = startCol; cIndex < startCol + colNum; cIndex++) { sheet.setColumnWidth(cIndex, width); } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setAutoFit:%s", e.getMessage())); } } /** * 设置列自适应(先执行Start方法) * * @param sheetIndex * Sheet的索引,从0开始 * @param startCol * 开始列,从0开始 * @param colNum * 列数量 * @throws Exception */ public void setAutoFit(int sheetIndex, int startCol, int colNum) throws Exception { try { InputStream inputStream = new FileInputStream(m_FileName); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); inputStream.close(); Sheet sheet = workbook.getSheetAt(sheetIndex); for (int cIndex = startCol; cIndex < startCol + colNum; cIndex++) { sheet.autoSizeColumn(cIndex); } // 写入文件,采用分批写入的方式进行写入 OutputStream outputStream = new FileOutputStream(m_FileName); SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook(workbook, 1000); sXSSFWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("setAutoFit:%s", e.getMessage())); } } /** * 合并Excel * * @param toFileName * 写入的文件路径 * @param toSheetIndex * 写入的文件SheetIndex,如果写在最后请设置-1,否则请在Sheet数量范围内 * @param fromFileName * 读取的文件路径 * @param fromSheetIndex * 读取的文件SheetIndex * @throws Exception */ public void mergeExcel(String toFileName, int toSheetIndex, String fromFileName, int fromSheetIndex) throws Exception { try { // 1、打开Excel1 InputStream inputStream = new FileInputStream(toFileName); XSSFWorkbook toWorkbook = new XSSFWorkbook(inputStream); inputStream.close(); // 2、打开Excel2 inputStream = new FileInputStream(fromFileName); XSSFWorkbook fromWorkbook = new XSSFWorkbook(inputStream); inputStream.close(); // 3、复制Sheet,放在ToExcel1的Sheet上 copySheet(toWorkbook, toSheetIndex, fromWorkbook, fromSheetIndex); // 写入Excel1文件 OutputStream outputStream = new FileOutputStream(toFileName); toWorkbook.write(outputStream); outputStream.close(); } catch (Exception e) { throw new Exception(String.format("mergeExcel:%s", e.getMessage())); } } private void copySheet(XSSFWorkbook toWorkbook, int toSheetIndex, XSSFWorkbook fromWorkbook, int fromSheetIndex) throws Exception { Sheet fromSheet = fromWorkbook.cloneSheet(fromSheetIndex); String sheetName = fromSheet.getSheetName().replace("(2)", ""); Sheet toSheet = toWorkbook.getSheet(sheetName); if (null == toSheet) { toSheet = toWorkbook.createSheet(sheetName); if(toSheetIndex >= 0){ toWorkbook.setSheetOrder(sheetName, toSheetIndex); } } else { throw new Exception("相同名称的Sheet已存在"); } // 1、合并单元格 for (int mrIndex = 0; mrIndex < fromSheet.getNumMergedRegions(); mrIndex++) { CellRangeAddress cellRangeAddress = fromSheet .getMergedRegion(mrIndex); toSheet.addMergedRegion(cellRangeAddress); } // 2、单元格赋值,样式等 Map<Integer, Integer> setColumnWidthIndex = new HashMap<Integer, Integer>(); Map<Short, Short> setFontIndex = new HashMap<Short, Short>(); for (int rIndex = fromSheet.getFirstRowNum(); rIndex <= fromSheet .getLastRowNum(); rIndex++) { Row fromRow = fromSheet.getRow(rIndex); if (null == fromRow) { continue; } Row toRow = toSheet.createRow(rIndex); // 设置行高,自动行高即可 //toRow.setHeight(fromRow.getHeight()); // 设置Cell的值和样式 for (int cIndex = fromRow.getFirstCellNum(); cIndex <= fromRow .getLastCellNum(); cIndex++) { Cell fromCell = fromRow.getCell(cIndex); if (null == fromCell) { continue; } Cell toCell = toRow.createCell(cIndex); // 设置列宽 Integer isSet = setColumnWidthIndex.get(cIndex); if (null == isSet) { toSheet.setColumnWidth(cIndex, fromSheet .getColumnWidth(cIndex)); setColumnWidthIndex.put(cIndex, cIndex); } // 设置单元格样式 CellStyle fromCellStyle = fromCell.getCellStyle(); if (fromCellStyle.getIndex() != 0) { XSSFCellStyle toCellStyle = toWorkbook.createCellStyle(); // 文字展示样式 String fromDataFormat = fromCellStyle.getDataFormatString(); if ((null != fromDataFormat) && ("".equals(fromDataFormat) == false)) { DataFormat toDataFormat = toWorkbook.createDataFormat(); toCellStyle.setDataFormat(toDataFormat .getFormat(fromDataFormat)); } // 文字换行 toCellStyle.setWrapText(fromCellStyle.getWrapText()); // 文字对齐方式 toCellStyle.setAlignment(fromCellStyle.getAlignment()); toCellStyle.setVerticalAlignment(fromCellStyle .getVerticalAlignment()); // 单元格边框 toCellStyle.setBorderLeft(fromCellStyle.getBorderLeft()); toCellStyle.setBorderRight(fromCellStyle.getBorderRight()); toCellStyle.setBorderTop(fromCellStyle.getBorderTop()); toCellStyle .setBorderBottom(fromCellStyle.getBorderBottom()); // 字体颜色,大小 short fromFontIndex = fromCellStyle.getFontIndex(); XSSFFont fromFont = fromWorkbook.getFontAt(fromFontIndex); Short toFontIndex = setFontIndex.get(fromFontIndex); if (null == toFontIndex) { XSSFFont toFont = toWorkbook.createFont(); toFont.setBoldweight(fromFont.getBoldweight()); toFont.setFontName(fromFont.getFontName()); toFont.setFontHeightInPoints(fromFont .getFontHeightInPoints()); toFont.setColor(fromFont.getXSSFColor()); toFont.setBold(fromFont.getBold()); toCellStyle.setFont(toFont); // 设置的Font加入集合中 toFontIndex = toFont.getIndex(); setFontIndex.put(fromFontIndex, toFontIndex); } else { XSSFFont toFont = toWorkbook.getFontAt(toFontIndex); toCellStyle.setFont(toFont); } // 背景色 XSSFColor fillForegroundColor = (XSSFColor) fromCellStyle .getFillForegroundColorColor(); toCellStyle.setFillForegroundColor(fillForegroundColor); toCellStyle.setFillPattern(fromCellStyle.getFillPattern()); toCell.setCellStyle(toCellStyle); } int fromCellType = fromCell.getCellType(); switch (fromCellType) { case Cell.CELL_TYPE_STRING: toCell.setCellValue(fromCell.getStringCellValue()); break; case Cell.CELL_TYPE_NUMERIC: toCell.setCellValue(fromCell.getNumericCellValue()); break; case Cell.CELL_TYPE_BOOLEAN: toCell.setCellValue(fromCell.getBooleanCellValue()); break; default: toCell.setCellValue(fromCell.getStringCellValue()); break; } } } } }
3、源码下载