1.Apache POI的组件
Apache POI包含用于处理了Office的所有OLE2符合文档的类和方法。该API的组件列表如下。
- POIFS → 该组件时所有其他POI元素的基本要素。他用于显式读取不同的文件。
- HSSF → 用于读写xls格式的excel文件
- XSSF → 用于读写xlsx格式的excel文件
- HPSF → 它用于提取Office文件的属性集
- HWPF → 用于读写Word的doc扩展的文件。
- XWPF → 用于读写Word的docx扩展的文件。
- HSLF → 用户阅读,创建和编辑PowerPoint演示文稿。
- HDGF → 他包含Ms-Visio二进制的类和方法
- HPDF → 它用于读取和写入MS-Publisher文件。
本文只介绍Java处理Excel文件的过程。因此,仅限于HSSF和XSSF组件。
2. POI的核心类
2.1 Workbook
这是创建或维护Excel工作簿的所有类的超级接口。它属于org.apache.poi.ss.usermode包。实现这个接口的两个类如下:
- HSSFWorkbook:此类具有读取和写入【xls】格式的excel文件的方法。
- XSSFWorkbook:此类具有读取和写入【xls,xlsx】格式的文件的方法。
2.2 HSSFWorkbook
它是org.apache.poi.hssf.usermodel包下的高级类。它实现了Workbook接口,用于【xls】格式的excel文件。下面列出了该类下的一些方法和构造函数。
类构造函数:
序号 | 类构造函数 | 描述 |
1 | HSSFWorkbook() | 从头开始创建一个新的HSSFWorkbook对象。 |
2 | HSSFWorkbook(DirectoryNode directory, boolean preserverNodes) | 在特定目录中创建一个新的HSSFWorkbook对象。 |
3 | HSSFWorkbook(DirectoryNode directory, POIFSFileSystem fs, boolean preserveNodes) | 给定一个POIFSFileSystem对象和其中的特定目录,它会创建一个SSFWorkbook对象来读取指定的工作簿。 |
4 | HSSFWorkbook(InputStream s) | 使用输入流创建一个新的HSSFWorkbook对象。 |
5 | HSSFWorkbook(InputStream s, boolean preserveNodes) | 围绕输入流构建POI文件系统 |
6 | HSSFWorkbook(POIFSFileSystem fs) | 使用POIFSFile对象构造一个新的HSSFWorkbook对象 |
7 | HSSFWorkbook(POIFSFileSystem fs, boolean preserveNodes) | 给定一个POIFSFileSystem对象,它会创建一个新的HSSFWorkbook对象来读取指定的工作簿 |
这些构造函数中经常使用的参数:
directory:它是要处理的POI文件系统目录。
fs:它是包含工作簿的POI文件系统。
preservenodes:这是一个可选参数,决定是否保留其他节点,如宏。它消耗大量内存。
2.3 XSSFWorkbook
它是一个用于表示高级和低级excel文件格式的类。它属于org.apache.xssf.usermodel包,实现了Workbook接口。下面列出了这个类下的方法和构造函数。
类构造函数
序号 | 构造函数 | 描述 |
1 | XSSFWorkbook() | 从头开始创建一个新的XSSFworkbook对象 |
2 | XSSFWorkbook(File file) | 从给定的文件构造一个XSSFWorkbook对象 |
3 | XSSFWorkbook(InputStream is) | 构造一个XSSFWorkbook对象,方法是将整个输入流缓冲到内存中,然后为其打开一个OPCPackage对象。 |
4 | XSSFWorkbook(String path) | 在给定的文件的完整路径的情况下构造一个XSSFWorkbook对象。 |
类方法
序号 | 方法 | 描述 |
1 | createSheet() | 为此工作簿创建一个XSSFSheet,将其添加到工作表中,并返回高级表示。 |
2 | createSheet(String sheetName) | 为此工作簿创建一个新工作表并返回高级表示。 |
3 | createFont() | 创建新字体并添加到工作簿的字体表中。 |
4 | createCellStyle() | 创建一个新的XSSFCellStyle并将其添加到工作簿的样式表中。 |
5 | setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow, int endRow) | 根据指定参数设置给定工作簿的打印区域。 |
2.4 Sheet
Sheet是org.apache.poi.ss.usermodel包下的一个接口,它是创建具有特定名称的高级或低级电子表格的所有类的超级接口。最常见的电子表格类型是工作表,它表示为单元格网格。
2.5 HSSFSheet
这是org.apache.poi.hssf.usermodel包下的一个类。它可以创建excel电子表格,并允许格式化工作表样式和工作表数据。
类构造函数
序号 | 构造函数 | 描述 |
1 | HSSFSheet(HSSFWorkbook workbook) | 创建由HSSFWorkbook调用的新HSSFSheet以从头开始创建工作表。 |
2 | HSSFSheet(HSSFWorkboot workbook, InternalSheet sheet) | 创建一个表示给定工作表对象的HSSFSheet。 |
2.6 XSSFSheet
这是一个代表excel电子变革的高级表示的类。它在org.apache,poi,hssf.usermodel包下。
类构造函数
序号 | 构造函数 | 描述 |
1 | XSSFSheet() | 创建一个新的XSSFSheet对象由XSSFWorkbook调用以从头开始创建工作表。 |
2 | XSSFSheet(PaceagePart part, PackageRelationship rel) | 创建一个表示给定包部分和关系的XSSFSheet。 |
类方法
序号 | 方法 | 描述 |
1 | addMergedRegion(CellRangeAddress region) | 添加单元格的合并区域 |
2 | autoSizeColumn(int column) | 调整列宽以适合内容 |
3 | iterator() | 此方法是rowIterator()的别名,以允许foreach循环 |
4 | addHyperlink(XSSFHyperlink hyperlink) | 在此工作表上的超链接结合中注册一个超链接。 |
2.7 Row
这个是电子表格行的高级表示。它是POI库中行的所有类的超级接口
2.8 XSSFRow
它实现了Row接口,因此它可以在电子表格中创建行。
类方法
序号 | 方法 | 描述 |
1 | createCell(int columnIndex) | 在行内创建新单元格并将其返回 |
2 | setHeight(short height) | 设置行高度 |
2.9 Cell
它是代表电子表格行中单元格的所有类的超级接口。单元格可以采用各种属性,例如空白,数字,日期,错误等。在添加到行之前,端元个应该有自己的数字(从0开始)。
2.10 XSSFCell
它实现了Cell接口。他是电子表格行中单元格的高级表示。
序号 | 方法 | 描述 |
1 | setCellStyle(CellStyle style) | 设置单元格的样式。 |
2 | setCellType(int cellType) | 设置单元格的类型(数字,公式或字符串) |
3 | setCellValue(boolean value) | 为单元格设置一个布尔值 |
4 | setCellValue(Calendar value) | 设置单元格的日期值 |
5 | setCellValue(double value) | 设置单元格个的数值 |
6 | setCellValue(String str) | 为单元格设置一个字符串值 |
7 | setHyperlink(Hyperlink hyperlink) | 分配一个超链接到这个单元格 |
2.11 XSSFCellStyle
它将提供有关电子表格中内容格式的可能星系。它提供了用于修改该格式的选项。它实现了CellStyle接口。
类构造函数
序号 | 构造函数 | 描述 |
1 | XSSFCellStyle(int cellXfId, int cellStyleXfId, StylesTable styleSource, ThemesTable theme) | 从提供的部件创建单元格样式。 |
2 | XSSFCellStyle(StylesTable stylesSource) | 创建一个空的单元格样式 |
类方法
序号 | 方法 | 描述 |
1 | setAlignment(short align) | 设置单元格的水平对齐类型 |
2 | setBorderBottom(short border) | 设置单元格个底部边框类型 |
3 | setBorderColor(BorderSide side, XSSFColor color) | 设置选定边框的颜色 |
4 | setBorderLeft(short border) | 设置单元格左边框的边框格式 |
5 | setBorderRight(short border) | 设置单元格有边框的边框格式 |
6 | setBorderTop(short border) | 设置单元格上边框的边框格式 |
7 | setFillBackgroundColor(XSSFColor color) | 设置表示为XSSFColor值得背景填充颜色 |
8 | setFillForegroundColor(XSSFColor color) | 设置表示为XSSFColor值得前景填充颜色 |
9 | setFillPattern(short fp) | 指定图案和纯色单元格填充得单元格填充信息 |
10 | setFont(Font font) | 设置此样式得字体 |
11 | setRotation(short rotation) | 设置单元格中文得旋转度数 |
12 | setVerticalAlignment(short align) | 设置单元格得垂直对齐格式 |
2.12 XSSFont
它实现了Font接口,因此它可以处理工作薄中得不同字体。
类构造函数
序号 | 构造函数 | 描述 |
1 | XSSFFont() | 创建一个字体对象 |
方法
序号 | 方法 | 描述 |
1 | setBold(boolean bold) | 设置字体是否为粗体 |
2 | setColor(short color) | 设置字体的索引颜色 |
3 | setColor(XSSFColor color) | 以标准RGB颜色设置字体颜色 |
4 | setFontHeight(short height) | 以磅为单位设置字体高度 |
5 | setFontName(String name) | 设置字体的名称 |
6 | setItalic(boolean italic) | 设置紫铜是否为斜体 |
3. POI工作薄
3.1 创建空白工作簿
import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class CreateWorkBook {
public static void main(String[] args)throws Exception {
//创建一个空的工作薄
XSSFWorkbook workbook = new XSSFWorkbook();
//创建一个的文件名称
FileOutputStream out = new FileOutputStream(new File("createworkbook.xlsx"));
//使用文件输出对象写入操作工作簿
workbook.write(out);
out.close();
System.out.println("createworkbook.xlsx written successfully");
}
}
3.2 打开现有的工作薄
import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class OpenWorkBook {
public static void main(String args[])throws Exception {
try {
File file = new File("openworkbook.xlsx");
FileInputStream fIP = new FileInputStream(file);
//获取XLSX文件的工作簿实例
XSSFWorkbook workbook = new XSSFWorkbook(fIP);
if(file.isFile() && file.exists()) {
System.out.println("openworkbook.xlsx file open successfully.");
} else {
System.out.println("Error to open openworkbook.xlsx file.");
}
} catch(Exception e) {
System.out.println("Error to open openworkbook.xlsx file." + e.getMessage());
}
}
}
4. POI电子表格
创建电子表格,先创建一个workbook,然后我们就可以继续创建sheet了。
以下是创建电子表格的代码段
//创建一个空的工作薄
XSSFWorkbook workbook = new XSSFWorkbook();
//创建一个空的sheet
XSSFSheet spreadsheet = workbook.createSheet("Sheet Name");
4.1 写入电子表格
考虑一个员工数据的例子,
Emp Id | Emp Name | Designation |
---|---|---|
Tp01 | Gopal | Technical Manager |
TP02 | Manisha | Proof Reader |
Tp03 | Masthan | Technical Writer |
Tp04 | Satish | Technical Writer |
Tp05 | Krishna | Technical Writer |
代码片段
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Writesheet {
public static void main(String[] args) throws Exception {
//创建一个新的工作薄
XSSFWorkbook workbook = new XSSFWorkbook();
//创建一个新的sheet
XSSFSheet spreadsheet = workbook.createSheet(" Employee Info ");
//创建一行
XSSFRow row;
//定义要输出的数据
Map < String, Object[] > empinfo = new TreeMap < String, Object[] >();
empinfo.put( "1", new Object[] { "EMP ID", "EMP NAME", "DESIGNATION" });
empinfo.put( "2", new Object[] { "tp01", "Gopal", "Technical Manager" });
empinfo.put( "3", new Object[] { "tp02", "Manisha", "Proof Reader" });
empinfo.put( "4", new Object[] { "tp03", "Masthan", "Technical Writer" });
empinfo.put( "5", new Object[] { "tp04", "Satish", "Technical Writer" });
empinfo.put( "6", new Object[] { "tp05", "Krishna", "Technical Writer" });
Set < String > keyid = empinfo.keySet();
int rowid = 0;
for (String key : keyid) {
row = spreadsheet.createRow(rowid++);
Object [] objectArr = empinfo.get(key);
int cellid = 0;
for (Object obj : objectArr) {
Cell cell = row.createCell(cellid++);
cell.setCellValue((String)obj);
}
}
FileOutputStream out = new FileOutputStream(new File("Writesheet.xlsx"));
workbook.write(out);
out.close();
System.out.println("Writesheet.xlsx written successfully");
}
}
4.2 从电子表格中读取数据
import java.io.File;
import java.io.FileInputStream;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Readsheet {
static XSSFRow row;
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream(new File("WriteSheet.xlsx"));
XSSFWorkbook workbook = new XSSFWorkbook(fis);
XSSFSheet spreadsheet = workbook.getSheetAt(0);
Iterator < Row > rowIterator = spreadsheet.iterator();
while (rowIterator.hasNext()) {
row = (XSSFRow) rowIterator.next();
Iterator < Cell > cellIterator = row.cellIterator();
while ( cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case NUMERIC:
System.out.print(cell.getNumericCellValue() + " \t\t ");
break;
case STRING:
System.out.print(
cell.getStringCellValue() + " \t\t ");
break;
}
}
System.out.println();
}
fis.close();
}
}
5. POI单元格
5.1 创建一个单元格
//create new workbook XSSFWorkbook workbook = new XSSFWorkbook(); //create spreadsheet with a name XSSFSheet spreadsheet = workbook.createSheet("new sheet"); //create first row on a created spreadsheet XSSFRow row = spreadsheet.createRow(0); //create first cell on created row XSSFCell cell = row.createCell(0);
5.2 单元格类型
单元格类型指定单元格是否可以包含字符串、数值或公式。 字符串单元格不能保存数值,数字单元格不能保存字符串。
以下代码用于在电子表格中创建不同类型的单元格。
import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class TypesofCells {
public static void main(String[] args)throws Exception {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet spreadsheet = workbook.createSheet("cell types");
XSSFRow row = spreadsheet.createRow((short) 2);
row.createCell(0).setCellValue("Type of Cell");
row.createCell(1).setCellValue("cell value");
row = spreadsheet.createRow((short) 3);
row.createCell(0).setCellValue("set cell type BLANK");
row.createCell(1);
row = spreadsheet.createRow((short) 4);
row.createCell(0).setCellValue("set cell type BOOLEAN");
row.createCell(1).setCellValue(true);
row = spreadsheet.createRow((short) 5);
row.createCell(0).setCellValue("set cell type date");
row.createCell(1).setCellValue(new Date());
row = spreadsheet.createRow((short) 6);
row.createCell(0).setCellValue("set cell type numeric");
row.createCell(1).setCellValue(20 );
row = spreadsheet.createRow((short) 7);
row.createCell(0).setCellValue("set cell type string");
row.createCell(1).setCellValue("A String");
FileOutputStream out = new FileOutputStream(new File("typesofcells.xlsx"));
workbook.write(out);
out.close();
System.out.println("typesofcells.xlsx written successfully");
}
}
5.3 单元格样式
您可以在这里学习如何设置单元格格式并应用不同的样式,例如合并相邻单元格、添加边框、设置单元格对齐方式和填充颜色。
以下代码用于使用 Java 编程将不同的样式应用于单元格。
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Color;
import org.apache.poi.ss.usermodel.FillPatternType;
public class CellStyle {
public static void main(String[] args)throws Exception {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet spreadsheet = workbook.createSheet("cellstyle");
XSSFRow row = spreadsheet.createRow((short) 1);
row.setHeight((short) 800);
XSSFCell cell = (XSSFCell) row.createCell((short) 1);
cell.setCellValue("test of merging");
//MEARGING CELLS
//this statement for merging cells
spreadsheet.addMergedRegion(
new CellRangeAddress(
1, //first row (0-based)
1, //last row (0-based)
1, //first column (0-based)
4 //last column (0-based)
)
);
//CELL Alignment
row = spreadsheet.createRow(5);
cell = (XSSFCell) row.createCell(0);
row.setHeight((short) 800);
// Top Left alignment
XSSFCellStyle style1 = workbook.createCellStyle();
spreadsheet.setColumnWidth(0, 8000);
style1.setAlignment(HorizontalAlignment.LEFT);
style1.setVerticalAlignment(VerticalAlignment.TOP);
cell.setCellValue("Top Left");
cell.setCellStyle(style1);
row = spreadsheet.createRow(6);
cell = (XSSFCell) row.createCell(1);
row.setHeight((short) 800);
// Center Align Cell Contents
XSSFCellStyle style2 = workbook.createCellStyle();
style2.setAlignment(HorizontalAlignment.CENTER);
style2.setVerticalAlignment(VerticalAlignment.CENTER);
cell.setCellValue("Center Aligned");
cell.setCellStyle(style2);
row = spreadsheet.createRow(7);
cell = (XSSFCell) row.createCell(2);
row.setHeight((short) 800);
// Bottom Right alignment
XSSFCellStyle style3 = workbook.createCellStyle();
style3.setAlignment(HorizontalAlignment.RIGHT);
style3.setVerticalAlignment(VerticalAlignment.BOTTOM);
cell.setCellValue("Bottom Right");
cell.setCellStyle(style3);
row = spreadsheet.createRow(8);
cell = (XSSFCell) row.createCell(3);
// Justified Alignment
XSSFCellStyle style4 = workbook.createCellStyle();
style4.setAlignment(HorizontalAlignment.JUSTIFY);
style4.setVerticalAlignment(VerticalAlignment.JUSTIFY);
cell.setCellValue("Contents are Justified in Alignment");
cell.setCellStyle(style4);
//CELL BORDER
row = spreadsheet.createRow((short) 10);
row.setHeight((short) 800);
cell = (XSSFCell) row.createCell((short) 1);
cell.setCellValue("BORDER");
XSSFCellStyle style5 = workbook.createCellStyle();
style5.setBorderBottom(BorderStyle.THICK);
style5.setBottomBorderColor(IndexedColors.BLUE.getIndex());
style5.setBorderLeft(BorderStyle.DOUBLE);
style5.setLeftBorderColor(IndexedColors.GREEN.getIndex());
style5.setBorderRight(BorderStyle.HAIR);
style5.setRightBorderColor(IndexedColors.RED.getIndex());
style5.setBorderTop(BorderStyle.DOTTED);
style5.setTopBorderColor(IndexedColors.CORAL.getIndex());
cell.setCellStyle(style5);
//Fill Colors
//background color
row = spreadsheet.createRow((short) 10 );
cell = (XSSFCell) row.createCell((short) 1);
XSSFCellStyle style6 = workbook.createCellStyle();
style6.setFillBackgroundColor(IndexedColors.LIME.index);
style6.setFillPattern(FillPatternType.LESS_DOTS);
style6.setAlignment(HorizontalAlignment.FILL);
spreadsheet.setColumnWidth(1,8000);
cell.setCellValue("FILL BACKGROUNG/FILL PATTERN");
cell.setCellStyle(style6);
//Foreground color
row = spreadsheet.createRow((short) 12);
cell = (XSSFCell) row.createCell((short) 1);
XSSFCellStyle style7 = workbook.createCellStyle();
style7.setFillForegroundColor(IndexedColors.BLUE.index);
style7.setFillPattern( FillPatternType.LESS_DOTS);
style7.setAlignment(HorizontalAlignment.FILL);
cell.setCellValue("FILL FOREGROUND/FILL PATTERN");
cell.setCellStyle(style7);
FileOutputStream out = new FileOutputStream(new File("cellstyle.xlsx"));
workbook.write(out);
out.close();
System.out.println("cellstyle.xlsx written successfully");
}
}