文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
POI 简介
Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对 Microsoft Office 格式档案读和写的功能。
POI Excel文档结构类
类名 | 描述 |
---|---|
HSSFWorkbook | Excel 文档对象 |
HSSFSheet | Excel 的工作表 |
HSSFRow | Excel 的行 |
HSSFCell | Excel 的单元格 |
HSSFFont | Excel 字体 |
HSSFName | 名称 |
HSSFDataFormat | 日期格式 |
HSSFHeader | 工作表头 |
HSSFFooter | 工作表尾 |
HSSFCellStyle | 单元格样式 |
HSSFDateUtil | 日期工具 |
HSSFPrintSetup | 打印 |
HSSFErrorConstants | 错误信息表 |
Excel 常用操作方法
获取 Excel 常用对象
- 得到 Excel 工作簿对象
HSSFWorkbook wb = new HSSFWorkbook(fs);
- 得到 Excel 工作表对象
HSSFSheet sheet = wb.getSheetAt(0);
- 得到 Excel 工作表的行
HSSFRow row = sheet.getRow(i);
- 得到 Excel 工作表指定行的单元格
HSSFCell cell = row.getCell((short) j);
- 得到单元格样式
CellStyle cellStyle = cell.getCellStyle();
创建 Excel 常用对象
- 创建 Excel 工作簿对象
HSSFWorkbook wb = new HSSFWorkbook();
- 创建 Excel 工作表对象
HSSFSheet sheet = wb.createSheet("new sheet");
- 创建 Excel 工作表的行
HSSFRow row = sheet.createRow((short)0);
- 创建单元格样式
cellStyle = wb.createCellStyle();
- 创建 Excel 工作表指定行的单元格
row.createCell((short)0).setCellStyle(cellStyle);
- 设置 Excel 单元格的值
row.createCell((short)0).setCellValue(1);
Excel 常用操作
- 设置工作表名称
wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16);
- 取得工作表的数目
wb.getNumberOfSheets();
- 取得一行的有效单元格个数
row.getLastCellNum();
- 单元格值类型读写
// 设置单元格为STRING类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 读取为数值类型的单元格内容
cell.getNumericCellValue();
- 设置列宽、行高
// 设置列宽
sheet.setColumnWidth((short)column,(short)width);
// 调整单元格宽度
sheet.setAutobreaks(true);
// 自动根据长度调整单元格长度
sheet.autoSizeColumn((short) i);
// 设置行高
row.setHeight((short)height);
- 添加区域,合并单元格
// 合并从第 rowFrom 行 columnFrom 列到 rowTo 行 columnTo 列的区域
Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo,(short)columnTo);
sheet.addMergedRegion(region);
// 得到所有区域
sheet.getNumMergedRegions();
// 合并 4 行 2 列
sheet.addMergedRegion(newCellRangeAddress(0, 4, 0, 2));
- 保存 Excel 文件
FileOutputStream fileOut = new FileOutputStream(path);
wb.write(fileOut);
- 设置单元格边框格式
HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);// 下边框
style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);// 左边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
- 设置字体和内容位置
HSSFFont f = wb.createFont();
f.setFontHeightInPoints((short) 11);// 设置字号
f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);// 加粗
style.setFont(f);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
style.setRotation(short rotation);// 单元格内容的旋转的角度
HSSFDataFormat df = wb.createDataFormat();
style1.setDataFormat(df.getFormat("0.00%"));// 设置单元格数据格式
cell.setCellFormula(string);// 给单元格设公式
- 插入图片
// 先把读进来的图片放到一个 ByteArrayOutputStream 中,以便产生 ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));
ImageIO.write(bufferImg,"jpg",byteArrayOut);
// 读进一个 Excel 模版
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");
fs = new POIFSFileSystem(fos);
// 创建一个工作薄
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
- 调整工作表位置
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("format sheet");
HSSFPrintSetup ps = sheet.getPrintSetup();
sheet.setAutobreaks(true);
ps.setFitHeight((short)1);
ps.setFitWidth((short)1);
- 设置打印区域
HSSFSheet sheet = wb.createSheet("Sheet1");
wb.setPrintArea(0, "$A$1:$C$2");
- 设置脚注
HSSFSheet sheet = wb.createSheet("format sheet");
HSSFFooter footer = sheet.getFooter()
footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );
- 选中指定的工作表
HSSFSheet sheet = wb.createSheet("row sheet");
heet.setSelected(true);
- 工作表的放大缩小
HSSFSheet sheet1 = wb.createSheet("new sheet");
sheet1.setZoom(1,2); // 50% 这里是个分数,例如:sheet.setZoom(3,4); 为 75%
- 设置头注
HSSFSheet sheet = wb.createSheet("new sheet");
HSSFHeader header = sheet.getHeader();
header.setCenter("Center Header");
header.setLeft("Left Header");
header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +
HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");
- 自定义字体颜色和背景颜色
HSSFCellStyle style = wb.createCellStyle();
style.setFillForegroundColor(HSSFColor.LIME.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
HSSFFont font = wb.createFont();
font.setColor(HSSFColor.RED.index);
style.setFont(font);
cell.setCellStyle(style);
- 设置不显示 Excel 网格线
sheet.setDisplayGridlines(false);
- 设置 Excel 单元格中的内容换行
// 设置单元格内容强制换行
cellStyle.setWrapText(true);
// 内容换行,加上 \r\n
- 设置打印
HSSFPrintSetupprint = (HSSFPrintSetup) sheet.getPrintSetup();
print.setLandscape(true);// 设置横向打印
print.setScale((short)70);// 设置打印缩放70%
print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);// 设置为A4纸张
print.setLeftToRight(true);// 設置打印顺序先行后列,默认为先列行
print.setFitHeight((short)10);// 设置缩放调整为10页高
print.setFitWidth((short)10);// 设置缩放调整为宽高
sheet.setAutobreaks(false);
if (i != 0&& i % 30 == 0)
sheet.setRowBreak(i);// 設置每 30 行分頁打印
- 设置批注
HSSFSheet sheet =workBook.getSheetAt(0);
HSSFPatriarch patr = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patr.createComment(new HSSFClientAnchor(0,0,0,0, (short)4, 2 ,(short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("添加注释!"));
HSSFColor 颜色类型
颜色 | 效果 |
---|---|
HSSFColor.GREY_80_PERCENT | |
HSSFColor.INDIGO | |
HSSFColor.PLUM | |
HSSFColor.BROWN | |
HSSFColor.OLIVE_GREEN | |
HSSFColor.DARK_GREEN | |
HSSFColor.SEA_GREEN | |
HSSFColor.DARK_TEAL | |
HSSFColor.GREY_40_PERCENT | |
HSSFColor.BLUE_GREY | |
HSSFColor.ORANGE | |
HSSFColor.LIGHT_ORANGE | |
HSSFColor.GOLD | |
HSSFColor.LIME | |
HSSFColor.AQUA | |
HSSFColor.LIGHT_BLUE | |
HSSFColor.TAN | |
HSSFColor.LAVENDER | |
HSSFColor.ROSE | |
HSSFColor.PALE_BLUE | |
HSSFColor.LIGHT_YELLOW | |
HSSFColor.LIGHT_GREEN | |
HSSFColor.LIGHT_TURQUOISE | |
HSSFColor.SKY_BLUE | |
HSSFColor.BLUE | |
HSSFColor.TEAL | |
HSSFColor.DARK_RED | |
HSSFColor.VIOLET | |
HSSFColor.TURQUOISE | |
HSSFColor.YELLOW | |
HSSFColor.PINK | |
HSSFColor.DARK_BLUE | |
HSSFColor.LIGHT_CORNFLOWER_BLUE | |
HSSFColor.ROYAL_BLUE | |
HSSFColor.CORA | |
HSSFColor.ORCHID | |
HSSFColor.LIGHT_TURQUOISE | |
HSSFColor.LEMON_CHIFFON | |
HSSFColor.PLUM | |
HSSFColor.CORNFLOWER_BLUE | |
HSSFColor.GREY_50_PERCENT | |
HSSFColor.GREY_25_PERCENT | |
HSSFColor.DARK_YELLOW | |
HSSFColor.GREEN | |
HSSFColor.BRIGHT_GREEN | |
HSSFColor.RED | |
HSSFColor.WHITE | |
HSSFColor.BLACK |
Excel 对象限制
Excel97
参数 | 限制 |
---|---|
允许的最大列数 | 256 (2^8) |
允许的最大行 | 64k (2^16) |
允许的公式个数 | 30 |
条件格式化单元格的个数 | 3 |
样式个数 | 4000 |
单元格内容的最大长度 | 32767 |
Excel2007
参数 | 限制 |
---|---|
允许的最大列数 | 16K (2^14) |
允许的最大行数 | 1M (2^20) |
允许的公式个数 | 255 |
条件格式化单元格的个数 | 不受限(受限于Excel的可用内存) |
样式的个数 | 64000 |
单元格内容的最大长度 | 32767 |