1.Apache POI简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能。
2.POI结构
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。
3、操作效果图
4、源码
1)导入数据到Excel
private static void PoiCreateExcel(String outputFile)
throws FileNotFoundException, IOException {
// 创建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
// 如要新建一名为"效益指标"的工作表,其语句为:
// HSSFSheet sheet = workbook.createSheet("效益指标");
HSSFSheet sheet = workbook.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue("员工信息表");
sheet.setColumnWidth(2, 15 * 256);//设置第一列的宽度是31个字符宽度
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
HSSFFont font = workbook.createFont();
font.setFontName("华文行楷");//设置字体名称
font.setFontHeightInPoints((short) 16);//设置字号
font.setColor(HSSFColor.RED.index);//设置字体颜色
style.setFont(font);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cell.setCellStyle(style);
// CellRangeAddress对象其实就是表示一个区域,其构造方法如下:CellRangeAddress(firstRow, lastRow, firstCol, lastCol),
// 参数的说明:
// firstRow 区域中第一个单元格的行号
// lastRow 区域中最后一个单元格的行号
// firstCol 区域中第一个单元格的列号
// lastCol 区域中最后一个单元格的列号
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 2);
sheet.addMergedRegion(region);
// 生成一个样式
style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
String[] headers = new String[] { "Id", "Name", "TelPhone" };
// 产生表格标题行
row = sheet.createRow(1);
for (short i = 0; i < headers.length; i++) {
cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
row = sheet.createRow(2);
String[] emp = new String[] { "0002", "张三丰", "1234567899" };
for (short i = 0; i < emp.length; i++) {
cell = row.createCell(i);
String value = emp[i];
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (value != null) {
cell.setCellValue((String) value);
} else {
HSSFRichTextString richString = new HSSFRichTextString(
(String) value);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
// 新建一输出文件流
FileOutputStream fOut = new FileOutputStream(outputFile);
// 把相应的Excel 工作簿存盘
workbook.write(fOut);
fOut.flush();
// 操作结束,关闭文件
fOut.close();
System.out.println("文件生成...");
}
2)读取Excel数据
private static void PoiReadExcel(String outputFile) throws IOException,
FileNotFoundException {
// 创建对Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(
new FileInputStream(outputFile));
// 创建对工作表的引用。
// 本例是按名引用(让我们假定那张表有着缺省名"Sheet1")
HSSFSheet sheet = workbook.getSheet("Sheet0");
// 也可用getSheetAt(int index)按索引引用,
// 在Excel文档中,第一张工作表的缺省索引是0,
// 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);
// 读取左上端单元
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell((short) 0);
// 输出单元内容,cell.getStringCellValue()就是取所在单元的值
System.out.println("表格标题: " + cell.getStringCellValue());
int rows = sheet.getLastRowNum();
int cols = row.getLastCellNum();
System.out.println("rows="+rows+",cols="+cols);
//遍历Excel
for (Row row1 : sheet) {
for (Cell cell1 : row1) {
System.out.print(cell1 + "\t");
}
System.out.println();
}
}
5、验证