目录
1、功能
Apache POI(Poor Obfuscation Implementation File System)提供基于流的处理。该库包含 Excel (97-2007) 文件格式(即 .xls)的 HSSF 实现。XSSF 库实现应该用于 Excel .xlsx 文件格式。HSSF 库和 XSSF API 提供了读取、写入或修改 Excel 电子表格的机制。
它还提供了 SXSSF,它是 XSSF 的扩展,可以处理非常大的 Excel 表格。SXSSF 需要较少的内存,适用于处理非常大的电子表格。
Apache POI 为其他 excel 功能提供了出色的支持,例如使用公式、通过填充颜色和边框来创建单元格样式、字体、页眉和页脚、数据验证、图像、超链接等。
2、安装
2.1、下载Jar文件
官方站点http://poi.apache.org/download.html下载一组 Jar 文件并在应用程序中使用。以下是最低要求的Jars。
- poi-3.17.jar
- poi-ooxml-3.17.jar
- commons-codec-1.10.jar
- poi-ooxml-schemas-3.17.jar
- xml-apis-1.0.b2.jar
- stax-api-1.0.1.jar
- xmlbeans-2.6.0.jar
- dom4j-1.6.1.jar
2.2、Maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
3、文档处理(Workbook)
为了处理 Excel (.xls) 文档,Apache POI 提供了完整的 API,其中包含可用于创建 excel、读取和写入数据的类和方法。
该HSSF是一个纯Java实现的Excel文件格式。在处理 excel 文件时,首先我们需要使用 HSSFWorkbook 类创建工作簿。
之后,为了在工作表中创建行和单元格,API 为每个提供了单独的类。要创建行,提供org.apache.poi.ss.usermodel.Row类和单元org.apache.poi.ss.usermodel.Cell类。
Apache POI Workbook常用方法
方法 | 描述 |
---|---|
CellStyle createCellStyle() | 创建一个新的单元格样式并将其添加到工作簿的样式表中 |
DataFormat createDataFormat() | 返回此工作簿的 DataFormat 实例 |
Font createFont() | 创建一个新字体并将其添加到工作簿的字体表中 |
Name createName() | 它在此工作簿中创建一个新的定义名称。 |
Sheet createSheet() | 为此工作簿创建一个工作表,将其添加到工作表中并返回高级表示。 |
Sheet createSheet(java.lang.String sheetname) | 为此工作簿创建一个新工作表并返回高级表示。 |
void write(java.io.OutputStream stream)throws java.io.IOException | 将此工作簿写出到输出流 |
示例
public class CreateWorkBook {
public static void main(String[] args) {
Workbook wb = new HSSFWorkbook();
try (OutputStream fileOut = new FileOutputStream("data/aaa.xls")) {
wb.write(fileOut);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
4、创建工作表
为了在 Excel 中创建工作表,POI 提供了一个方法createSheet(),每次调用函数时都会创建一个新工作表。创建工作表时,请考虑以下几点。
- 名称不得超过 31 个字符。
- 不得包含以下任何字符(
0x0000
、0x0003
、冒号 (:
)、反斜杠 (\
)、星号 (*
)、问号 (?
)、正斜杠 (/
)、左方括号 ([
)、右方括号 (]
))。
示例
public class NewSheet {
public static void main(String[] args) {
Workbook wb = new HSSFWorkbook();
try (OutputStream fileOut = new FileOutputStream("data/ab.xls")) {
Sheet sheet1 = wb.createSheet("First Sheet");
Sheet sheet2 = wb.createSheet("Second Sheet");
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
5、创建单元格
要在 Excel Sheet 中创建单元格,我们可以使用提供createCell() 方法的Apache POI 。此方法需要一个整数参数,它应该是一个列号。createCell() 是Row类的方法。
示例
public class NewCellExample {
public static void main(String[] args) {
Workbook wb = new HSSFWorkbook();
try (OutputStream os = new FileOutputStream("data/newcell.xls")) {
Sheet sheet = wb.createSheet("New Sheet");
Row row = sheet.createRow(2);
Cell cell = row.createCell(5);
cell.setCellValue("XXXXXXX");
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
6、创建日期单元格
要创建向单元格显示当前日期的日期单元格,我们可以使用 Apache POI 的样式功能根据日期格式化单元格。setDateformat() 方法用于设置日期格式。
示例
public class DateCellExample {
public static void main(String[] args) {
Workbook wb = new HSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
try(OutputStream os = new FileOutputStream("data/datecell.xls")){
Sheet sheet = wb.createSheet("New Sheet");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
//设置日期单元格
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("d-mmm-yy"));
cell = row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
7、单元格对齐
Apache POI 有助于以某种方式对齐单元格及其内容。我们可以设置单元格的高度和宽度并将其顶部或底部对齐。Sheet 类提供了设置高度和宽度的方法。
示例
public class AlignExample {
public static void main(String[] args) {
Workbook wb = new HSSFWorkbook();
try (OutputStream os = new FileOutputStream("data/align.xls")) {
Sheet spreadsheet = wb.createSheet("Sheet1");
Row row = spreadsheet.createRow(2);
Cell cell = row.createCell(0);
cell.setCellValue("Hello");
//样式
CellStyle cellStyle1 = wb.createCellStyle();
//设置多行显示
cellStyle1.setWrapText(true);
//左对齐
cellStyle1.setAlignment(HorizontalAlignment.LEFT);
cell.setCellStyle(cellStyle1);
row = spreadsheet.createRow(3);
cell = row.createCell(0);
cell.setCellValue("Hi");
//样式
CellStyle cellStyle2 = wb.createCellStyle();
//多行显示
cellStyle2.setWrapText(true);
//右对齐
cellStyle2.setAlignment(HorizontalAlignment.RIGHT);
cell.setCellStyle(cellStyle2);
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
8、单元格边框
Apache POI 提供了可用于设置边框颜色、细线、虚线等的方法。在下面的示例中,我们创建了一个单元格并设置了从上到下和右侧的边框。
示例
public class BorderExample {
public static void main(String[] args) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet");
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellValue(101);
// Styling border of cell.
CellStyle style = wb.createCellStyle();
style.setBorderLeft(BorderStyle.MEDIUM);//左边框中号线
style.setLeftBorderColor(IndexedColors.RED.getIndex());//红色
style.setBorderBottom(BorderStyle.THIN);//下边框细线
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());//黑色
style.setBorderRight(BorderStyle.DASHED);//右边框虚线
style.setRightBorderColor(IndexedColors.BLUE.getIndex());//蓝色
style.setBorderTop(BorderStyle.DOUBLE);//上边框双线
style.setTopBorderColor(IndexedColors.BLACK.getIndex());//黑色
cell.setCellStyle(style);
try (OutputStream fileOut = new FileOutputStream("data/border.xls")) {
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
9、单元格颜色
Apache POI 允许我们在背景和前景中设置单个单元格的颜色。为此,它提供了帮助设置单元格颜色的方法。
示例
public class ColorExample {
public static void main(String[] args) {
try (OutputStream fileOut = new FileOutputStream("data/color.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
Row row = sheet.createRow(1);
//背景色
CellStyle style1 = wb.createCellStyle();
style1.setFillBackgroundColor(IndexedColors.GREEN.getIndex());
style1.setFillPattern(FillPatternType.BIG_SPOTS);//填充模式
Cell cell = row.createCell(1);
cell.setCellValue("XXX");
cell.setCellStyle(style1);
//前景色
CellStyle style2 = wb.createCellStyle();
style2.setFillForegroundColor(IndexedColors.BLUE.getIndex());
style2.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell = row.createCell(2);
cell.setCellValue("YYY");
cell.setCellStyle(style2);
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
10、合并单元格
Apache POI 允许我们将单元格合并为一个单元格。为此,它提供了将单元格索引作为参数并将单元格合并为单个大单元格的方法。
示例
public class MergingCellExample {
public static void main(String[] args) {
try (OutputStream fileOut = new FileOutputStream("data/merg.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellValue("Two cells have merged");
//合并单元格
sheet.addMergedRegion(new CellRangeAddress(1,1,1,3));
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
11、字体
Apache POI 提供了处理 Excel 表格中字体的方法。我们可以创建字体、设置颜色、设置大小等。Font 是一个接口,它提供了处理字体的方法。
示例
public class FontExample {
public static void main(String[] args) {
try (OutputStream fileOut = new FileOutputStream("data/font.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
CellStyle style = wb.createCellStyle();
cell.setCellValue("HelloWorld");
//字体设置
Font font = wb.createFont();
font.setFontHeightInPoints((short)11);
font.setFontName("Courier New");
font.setItalic(true);//是否斜体
font.setStrikeout(true);//是否删除线
//字体应用到样式
style.setFont(font);
//样式应用到单元格
cell.setCellStyle(style);
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
12、标题
Apache POI 允许我们为我们的 excel 文档设置标题。它提供了 Sheet 接口的 getHeader() 方法,并返回了一个 Header 类型的实例。
示例
public class HeaderExample {
public static void main(String[] args) {
try (OutputStream fileOut = new FileOutputStream("data/header.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
//创建标题
Header header = sheet.getHeader();
header.setCenter("Center Header");
header.setLeft ("Left Header");
header.setRight ("Right align Header");
Row row = sheet.createRow(4);
Cell cell = row.createCell(1);
cell.setCellValue("HelloWorld");
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
13、隐藏行
使用 Apache POI,可以隐藏一行。要隐藏行,我们可以在行的实例上调用 setZeroHeight() 方法。此方法采用真或假参数。如果值为true,它将隐藏该行,如果值为false,它将取消隐藏该行。
示例
public class HideExample {
public static void main(String[] args) {
try (OutputStream os = new FileOutputStream("data/hiden.xls")) {
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Hello");
//设置隐藏行
row.setZeroHeight(true);
workbook.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
14、单元格属性
有时我们想要创建一个具有基本样式的电子表格,然后将特殊样式应用到某些单元格,例如在一系列单元格周围绘制边框或为某个区域设置填充。Apache POI 提供了CellUtil.setCellProperties,它允许我们这样做而无需在我们的电子表格中创建一堆不必要的中间样式。属性创建为Map并应用于单元格。
示例
public class CellPropertiesExample {
public static void main(String[] args) throws IOException {
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
Map<String, Object> properties = new HashMap<>();
//边框属性
properties.put(CellUtil.BORDER_TOP, BorderStyle.MEDIUM);
properties.put(CellUtil.BORDER_BOTTOM, BorderStyle.MEDIUM);
properties.put(CellUtil.BORDER_LEFT, BorderStyle.MEDIUM);
properties.put(CellUtil.BORDER_RIGHT, BorderStyle.MEDIUM);
//边框颜色
properties.put(CellUtil.TOP_BORDER_COLOR, IndexedColors.RED.getIndex());
properties.put(CellUtil.BOTTOM_BORDER_COLOR, IndexedColors.RED.getIndex());
properties.put(CellUtil.LEFT_BORDER_COLOR, IndexedColors.RED.getIndex());
properties.put(CellUtil.RIGHT_BORDER_COLOR, IndexedColors.RED.getIndex());
// 应用到B2单元格
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
for (Map.Entry<String, Object> e : properties.entrySet()) {
CellUtil.setCellStyleProperty(cell, e.getKey(), e.getValue());
}
cell.setCellValue("First"); // 单元格值
// 应用到3x3区域,从D4开始
for (int ix = 3; ix <= 5; ix++) {
row = sheet.createRow(ix);
for (int iy = 3; iy <= 5; iy++) {
cell = row.createCell(iy);
for (Map.Entry<String, Object> e : properties.entrySet()) {
CellUtil.setCellStyleProperty(cell, e.getKey(), e.getValue());
}
cell.setCellValue(ix + " * " + iy); // 单元格值
}
}
FileOutputStream fileOut = new FileOutputStream("data/prop.xls");
workbook.write(fileOut);
fileOut.close();
System.out.println("The end.");
}
}
15、绘制边框
Apache POI 允许我们在工作簿表中应用一组边框。PropertyTemplate对象模拟了这种用方法和定义为允许绘图的顶部,底部常量,左,右,水平,垂直,里面,单元格外边界。
示例
public class DrawingBorderExample {
public static void main(String[] args) {
try (OutputStream os = new FileOutputStream("data/temp.xls")) {
PropertyTemplate pt = new PropertyTemplate();
//设置所有边框,即顶部、底部、左侧和右侧,包括范围的内部*边框
pt.drawBorders(new CellRangeAddress(1, 2, 1, 2),
BorderStyle.MEDIUM, BorderExtent.ALL);
//仅设置外边框
pt.drawBorders(new CellRangeAddress(5, 6, 1, 2),
BorderStyle.MEDIUM, BorderExtent.OUTSIDE);
//仅设置内边框
pt.drawBorders(new CellRangeAddress(5, 6, 1, 2), BorderStyle.THIN,
BorderExtent.INSIDE);
//绿色外边框,蓝色内部垂直边界,红色内部水平边界
pt.drawBorders(new CellRangeAddress(9, 10, 1, 3),
BorderStyle.MEDIUM, IndexedColors.GREEN.getIndex(),
BorderExtent.OUTSIDE);
pt.drawBorders(new CellRangeAddress(9, 10, 1, 3),
BorderStyle.MEDIUM, IndexedColors.BLUE.getIndex(),
BorderExtent.INSIDE_VERTICAL);
pt.drawBorders(new CellRangeAddress(9, 10, 1, 3),
BorderStyle.MEDIUM, IndexedColors.RED.getIndex(),
BorderExtent.INSIDE_HORIZONTAL);
pt.drawBorders(new CellRangeAddress(10, 10, 2, 2),
BorderStyle.NONE,
BorderExtent.ALL);
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
pt.applyBorders(sheet);
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
16、单元格多种样式
为了将多种样式和文本格式应用于单元格,Apache POI 提供了 CellStyle 功能。我们可以为工作簿创建 CellStyle,然后将文本样式应用到单元格
示例
public class MultipleStylesExample {
public static void main(String[] args) {
try (OutputStream os = new FileOutputStream("data/style.xls")) {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
Row row = sheet.createRow(2);
XSSFFont font1 = (XSSFFont) wb.createFont();
XSSFFont font2 = (XSSFFont) wb.createFont();
XSSFFont font3 = (XSSFFont) wb.createFont();
XSSFCell hssfCell = (XSSFCell) row.createCell(2);
XSSFRichTextString richString = new XSSFRichTextString( "Hello, World!" );
richString.applyFont( 0, 6, font1 );
richString.applyFont( 6, 13, font2 );
hssfCell.setCellValue( richString );
XSSFCell cell = (XSSFCell) row.createCell(1);
XSSFRichTextString rt = new XSSFRichTextString("This is yiidian.com");
font1.setBold(true);
font1.setColor(new XSSFColor(new java.awt.Color(255, 0, 0)));
rt.applyFont(0, 12, font1);
font2.setItalic(true);
font2.setUnderline(XSSFFont.U_DOUBLE);
font2.setColor(new XSSFColor(new java.awt.Color(0, 255, 0)));
rt.applyFont(12, 18, font2);
font3.setColor(new XSSFColor(new java.awt.Color(0, 0, 255)));
rt.append(" Learn New Technology Easily", font3);
cell.setCellValue(rt);
wb.write(os);
}catch(Exception e) {
System.out.println(e);
}
}
}
17、单元格类型
为了在单元格中设置各种类型的值,Apache POI 提供了重载函数 setCellValue() ,它允许我们根据需要设置值。
示例
public enum CellType {
@Internal(since="POI 3.15 beta 3")
_NONE(-1), //未知
NUMERIC(0),//数值
STRING(1), //字符串
FORMULA(2),//公式
BLANK(3), //空白
BOOLEAN(4),//布尔值
ERROR(5); //错误
private final int code;
private CellType(int code) {
this.code = code;
}
public static CellType forInt(int code) {
for (CellType type : values()) {
if (type.code == code) {
return type;
}
}
throw new IllegalArgumentException("Invalid CellType code: " + code);
}
public int getCode() {
return code;
}
}
public class CellTypeExample {
public static void main(String[] args) {
try (OutputStream os = new FileOutputStream("data/type.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet");
Row row = sheet.createRow(2);
row.createCell(0).setCellValue(1.1); // Float value
row.createCell(1).setCellValue(new Date()); // Date type
row.createCell(2).setCellValue(Calendar.getInstance());// Calendar
row.createCell(3).setCellValue("a string value"); // String
row.createCell(4).setCellValue(true); // Boolean
row.createCell(5).setCellType(CellType.ERROR); // Error
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
18、绘制形状
HSSFSimpleShape 类用于在电子表格中绘制形状。这个类提供了一个方法 setShapeType() ,它有助于绘制各种形状,如椭圆、直线、矩形等。
示例
public class ShapeExample {
public static void main(String[] args) {
Workbook wb = new HSSFWorkbook();
try (OutputStream os = new FileOutputStream("data/shape.xls")) {
Sheet sheet = wb.createSheet("Sheet1");
Row row = sheet.createRow(4); // Creating a row
Cell cell = row.createCell(1); // Creating a cell
HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
HSSFClientAnchor a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );
HSSFSimpleShape shape = patriarch.createSimpleShape(a);
shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
19、插入图像
在 Apache POI 中,图像是绘图支持的一部分。要添加图像,只需在绘图族长上调用 createPicture() 即可。Apache POI 支持以下图像类型:
- PNG
- JPG
- DIB
应该注意的是,一旦我们将新图像添加到工作表中,任何现有的绘图都可能会被删除。
示例
public class OutlineExample {
public static void main(String[] args) {
FileOutputStream fileOut = null;
BufferedImage bufferImg = null;
//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
try {
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
bufferImg = ImageIO.read(new File("img/1.jpg"));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet1 = wb.createSheet("测试生成图片");
//画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
//anchor主要用于设置图片的属性
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255, (short) 1, 1, (short) 5, 25);
//不随行列移动,绝对位置,禁止缩放
anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
//插入图片
patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
fileOut = new FileOutputStream("data/img.xls");
// 写入excel文件
wb.write(fileOut);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
20、单元格换行符
为了将多行数据写入单元格,Apache POI 提供了处理它的方法。让我们看一个示例,其中我们将多行数据存储到 a 单元格中。
示例
public class NewLineExample {
public static void main(String[] args) {
try (OutputStream fileOut = new FileOutputStream("data/newline.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellValue("This is first line and \n this is second line");
CellStyle cs = wb.createCellStyle();
cs.setWrapText(true);//多行显示
cell.setCellStyle(cs);
row.setHeightInPoints((2*sheet.getDefaultRowHeightInPoints()));//2倍行高
sheet.autoSizeColumn(2);//调整列宽以适应内容。
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
21、大纲
大纲非常适合将信息的各个部分组合在一起。可以使用 POI API 的方法轻松地将其添加到列和行。
示例
public class OutLineDemo {
public static void main(String[] args) {
try (OutputStream fileOut = new FileOutputStream("data/otl.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("Sheet");
sheet1.groupRow( 4, 10 );
sheet1.groupColumn( 2, 8 );
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
22、设置页码
Apache POI 允许我们在工作表的页脚设置页码。设置页码 getFooter() 方法创建页脚,page() 和 numPages() 都用于设置页码。
示例
public class PageNumExample {
public static void main(String[] args) {
try (OutputStream os = new FileOutputStream("data/page.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
Footer footer = sheet.getFooter();
footer.setRight( "Page " + HeaderFooter.page() + " of " + HeaderFooter.numPages() );
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
23、读取单元格内容
示例
public class GettingCellContentExample {
public static void main(String[] args) {
try (InputStream inp = new FileInputStream("data/a.xls")) {
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = row.getCell(3);
if (cell != null)
System.out.println("Data: "+cell);
else
System.out.println("Cell is empty");
}catch(Exception e) {
System.out.println(e);
}
}
}
24、数据重写
为了将数据重写到现有的 Excel 文档中,Apache POI 提供了各种方法 getRow()、getCell()、getSheet() 等。
示例
public class RewritingExample {
public static void main(String[] args) throws Exception {
try (InputStream inp = new FileInputStream("yiidian.xls")) {
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = row.getCell(3);
if (cell == null)
cell = row.createCell(3);
cell.setCellType(CellType.STRING);
cell.setCellValue("101");
try (OutputStream fileOut = new FileOutputStream("yiidian.xls")) {
wb.write(fileOut);
}
}catch(Exception e) {
System.out.println(e);
}
}
}
25、数据移动行
为了从上到下移动行,反之亦然,Apache POI 提供了 shiftRows() 方法来执行行移动。此方法需要 startrow、endrow 和要移动的行数。
示例
public class ShiftRowsExample {
public static void main(String[] args) {
try (OutputStream os = new FileOutputStream("yiidian.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet");
Row row = sheet.createRow(1);
Row row2 = sheet.createRow(2);
Cell cell = row.createCell(1);
Cell cell2 = row2.createCell(1);
cell2.setCellValue("你好,一点教程网");
sheet.shiftRows(1, 2, -1);
wb.write(os);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
移动前:
移动后:
26、样式形状
默认情况下,形状有点简单。但是,可以对形状应用不同的样式。目前可以做的事情有:
- 更改填充颜色。
- 制作一个没有填充颜色的形状。
- 更改线条的粗细。
- 更改线条的样式。例如:虚线、虚线。
- 更改线条颜色。
示例
public class ShapeStyleExample {
public static void main(String[] args) {
try (OutputStream fileOut = new FileOutputStream("data/shapestyle.xls")) {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet");
Row row = sheet.createRow(4); // Creating a row
Cell cell = row.createCell(1); // Creating a cell
cell.setCellValue("HelloWorld");
HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
HSSFClientAnchor a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );
HSSFSimpleShape s = patriarch.createSimpleShape(a);
s.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
s.setLineStyleColor(10,10,10);
//s.setFillColor(90,10,200);
s.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3);
s.setLineStyle(HSSFShape.LINESTYLE_DOTSYS);
wb.write(fileOut);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
27、创建注释
评论是与单元格关联的富文本注释。评论内容与单元格分开存储,并显示在单独但与单元格相关联的文本框中。
使用 createComment() 方法创建评论。
示例
public class CellComments {
public static void main(String[] args) {
try (FileOutputStream out = new FileOutputStream("data/comments.xls")) {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Comment Sheet");
HSSFPatriarch hpt = sheet.createDrawingPatriarch();
HSSFCell cell1 = sheet.createRow(3).createCell(1);
cell1.setCellValue("Excel Comment Example");
//设置注释框大小
HSSFComment comment1 = hpt.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
//设置内容
comment1.setString(new HSSFRichTextString("It is a comment"));
//应用到单元格
cell1.setCellComment(comment1);
wb.write(out);
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
28、创建超链接
Apache POI 允许我们在电子表格中创建超链接。在单元格中设置网址并在单击时重定向到服务器很有用。
示例
public class HyperlinkFormula {
public static void main(String[] args) {
try (HSSFWorkbook wb = new HSSFWorkbook()) {
HSSFSheet sheet = wb.createSheet("new sheet");
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellType(CellType.FORMULA);
cell.setCellFormula("HYPERLINK(\"http://www.baidu.com\", \"点击我访问网站\")");
try (FileOutputStream fileOut = new FileOutputStream("data/link.xls")) {
wb.write(fileOut);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}