apache poi支持java对许多格式的文件进行导入、操作、生成,而poi的几个jar包有各自支持的文件格式,可以选择性导入需要的jar包。具体如下:
Component | Application type | Maven artifactId | Notes |
---|---|---|---|
POIFS | OLE2 Filesystem | poi | Required to work with OLE2 / POIFS based files |
HPSF | OLE2 Property Sets | poi | |
HSSF | Excel XLS | poi | For HSSF only, if common SS is needed see below |
HSLF | PowerPoint PPT | poi-scratchpad | |
HWPF | Word DOC | poi-scratchpad | |
HDGF | Visio VSD | poi-scratchpad | |
HPBF | Publisher PUB | poi-scratchpad | |
HSMF | Outlook MSG | poi-scratchpad | |
OpenXML4J | OOXML | poi-ooxml plus one of poi-ooxml-schemas, ooxml-schemas | Only one schemas jar is needed, see below for differences |
XSSF | Excel XLSX | poi-ooxml | |
XSLF | PowerPoint PPTX | poi-ooxml | |
XWPF | Word DOCX | poi-ooxml | |
Common SS | Excel XLS and XLSX | poi-ooxml | WorkbookFactory and friends all require poi-ooxml, not just core poi |
详情可以到官网http://poi.apache.org/components/上查看。
使用poi生成excel文件
java使用poi的api生成excel时,有清晰的逻辑过程,每一行代码的操作可以准确对应到在excel文件上的每一个操作。 下面的例子没有解释那么详细,因为很多方法作用熟悉excel的人一眼就看出来了
//创建Workbook 对应一个excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
//创建sheet 对应excel文件中的sheet
HSSFSheet sheet = workbook.createSheet("handleKnot");
//设置列宽 256代表一个字符宽度 10*256代表10个字符宽度
sheet.setColumnWidth(0, 10*256);
//生成行
Row row_1 = sheet.createRow(0)
Row row_2 = sheet.createRow(1)
//设置行高
row_1.setHeightInPoints(80);
row_2.setHeightInPoints(170);
//生成单元格
Cell cell_1_1 = row_1.createCell(0);
Cell cell_2_1 = row_2.createCell(0);
Cell cell_2_2 = row_2.createCell(1);
// 配置字体样式
Font font = workbook.createFont();
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
font.setFontHeightInPoints((short)18);
font.setFontName("黑体");
// 配置单元格样式
CellStyle style = workbook.createCellStyle();
style.setWrapText(true);
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setBorderTop(CellStyle.BORDER_THIN);
style.setFont(font);
//为单元格配置样式
cell_1_1.setCellStyle(style);
cell_2_1.setCellStyle(style);
cell_2_2.setCellStyle(style);
// 设置单元格值
cell_1_1.setCellValue("清远医保医疗智能审核平台(事后)业务办结表");
cell_2_1.setCellValue("需处理的业务事项");
//位单元格输入特殊格式值 比如单元格值换行就要如下这样写
String teString = "mao \r\n kk \r\n justin";
HSSFRichTextString richTextString = new HSSFRichTextString(teString);
cell_2_2.setCellValue(richTextString);
// 合并单元格参数时起始行 、终止行、起始列、终止列
CellRangeAddress address1 = new CellRangeAddress(0,0,0,3);
sheet.addMergedRegion(address1);
// 设置合并单元格的边框 这里要注意被合并的单元格要先生成 在合并 不然这个边框设置不生效
RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, address1, sheet, workbook);
RegionUtil.setBorderLeft(CellStyle.BORDER_THIN, address1, sheet, workbook);
RegionUtil.setBorderRight(CellStyle.BORDER_THIN, address1, sheet, workbook);
RegionUtil.setBorderTop(CellStyle.BORDER_THIN, address1, sheet, workbook);
// 设置打印页面
PrintSetup printSetup = sheet.getPrintSetup();
printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE);
应用
在生产环境中,大多数的excel都是以一行标题+多行值得形式呈现的,这样再每个单元格设置是相当低效的。
比如要将数据库中查询的数据存到excel中并导出,可以将标题与对应内容在库中查询时的key存在一个list中,再将库中取出的数据key值与list中的key值比对,再存到对应位置。我说的相当粗略,对于每个单元格格式内容的生成都可以包装