java 使用POI读写Excel文件(兼容2003、2007)
package com.jadyer.demo; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory; /**
* POI下载地址为http://poi.apache.org/
* 这里要用到poi-3.9-20121203.jar和poi-ooxml-3.9-20121203.jar
* @create Jul 9, 2013 7:54:34 PM
* @author 玄玉<http://blog.csdn.net/jadyer>
*/
public class POIDemo {
public static void writeExcel() throws IOException{
//创建一个Excel(or new XSSFWorkbook())
Workbook wb = new HSSFWorkbook();
//创建表格
Sheet sheet = wb.createSheet("测试Sheet_01");
//创建行
Row row = sheet.createRow(0);
//设置行高
row.setHeightInPoints(30);
//创建样式
CellStyle cs = wb.createCellStyle();
cs.setAlignment(CellStyle.ALIGN_CENTER);
cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
cs.setBorderBottom(CellStyle.BORDER_DOTTED);
cs.setBorderLeft(CellStyle.BORDER_THIN);
cs.setBorderRight(CellStyle.BORDER_THIN);
cs.setBorderTop(CellStyle.BORDER_THIN);
//创建单元格
Cell cell = row.createCell(0);
//设置单元格样式
cell.setCellStyle(cs);
//设置单元格的值
cell.setCellValue("序号");
cell = row.createCell(1);
cell.setCellStyle(cs);
cell.setCellValue("用户");
row = sheet.createRow(1);
cell = row.createCell(0);
cell.setCellValue("1");
cell = row.createCell(1);
cell.setCellValue("张起灵");
FileOutputStream fos = new FileOutputStream("D:/测试的Excel.xls");
wb.write(fos);
if(null != fos){
fos.close();
}
} public static void readExcel() throws InvalidFormatException, IOException{
//老版本POI是使用这种方式创建Workbook的,新版本中可以使用WorkbookFactory,它能自动根据文档的类型打开一个Excel
//Workbook wb = new HSSFWorkbook(new FileInputStream("D:/5月业务定制对账文件汇总.xls"));
Workbook wb = WorkbookFactory.create(new File("D:/5月业务定制对账文件汇总.xls"));
//获取Excel中的某一个数据表..也可以通过Sheet名称来获取,即Workbook.getSheet("定制对账文件")
Sheet sheet = wb.getSheetAt(0);
Row row = null;
Cell cell = null;
//获取Excel的总行数:Sheet.getLastRowNum()+1(需要+1)
for(/*int i=0*/ int i=sheet.getFirstRowNum(); i<sheet.getLastRowNum()+1; i++){
//获取数据表里面的某一行
row = sheet.getRow(i);
//获取Excel的总列数:Row.getLastCellNum()(不用+1)
for(/*int j=0*/ int j=row.getFirstCellNum(); j<row.getLastCellNum(); j++){
//获取一行中的一个单元格
cell = row.getCell(j);
System.out.print(getCellValue(cell) + "----");
}
//打印完一行的数据之后,再输入一个空行
System.out.println();
}
} /**
* 使用for-each循环来读取Excel
*/
public static void readExcelUseForeach() throws InvalidFormatException, IOException {
for(Row row : WorkbookFactory.create(new File("D:/5月业务定制对账文件汇总.xls")).getSheetAt(0)){
for(Cell cell : row){
System.out.print(getCellValue(cell) + "----");
}
System.out.println();
}
} /**
* 获取单元格内的数据值
*/
private static String getCellValue(Cell cell){
String str = null;
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK:
str = ""; break;
case Cell.CELL_TYPE_BOOLEAN:
str = String.valueOf(cell.getBooleanCellValue()); break;
case Cell.CELL_TYPE_FORMULA:
str = String.valueOf(cell.getCellFormula()); break;
case Cell.CELL_TYPE_NUMERIC:
str = String.valueOf(cell.getNumericCellValue()); break;
case Cell.CELL_TYPE_STRING:
str = cell.getStringCellValue(); break;
default:
str = null;
break;
}
return str;
}
}
http://blog.csdn.net/kings988/article/details/5865882
/**
* 本测试使用的POI版本为3.6
* 其Excel测试案例全部来自POI文档,部分根据情况做了不同程度的修改.
* 该测试仅供交流学习使用,代码根据个人理解基本上已做注释
* 测试环境:
* OS: Windows 7 Ultimate US_en
* IDE: MyEclipse 8.0 GA
* JDK: JDK_1.6_20
* MS Excel: Excel 2007 Zh_cn
* 作者:WESTDREAM
*/ package junit.westdream.test; import java.awt.Color;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFooter;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFShape;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
import org.apache.poi.hssf.usermodel.HSSFTextbox;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.contrib.CellUtil;
import org.apache.poi.ss.usermodel.contrib.RegionUtil;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.BeforeClass;
import org.junit.Test; /**
* @author WESTDREAM
* @since 2010-8-7 下午10:34:03
*/
public class POIExcelTest { /**
* @throws java.lang.Exception
*/
public static final String XLS_WORKBOOK_LOCATION = "D:/workbook.xls";
public static final String XLS_OR_XLSX_DIR = "D:/";
public static final String XLSX_WORKBOOK_LOCATION = "D:/workbook.xlsx";
public static final String IMAGE_LOCATION = "F:/Pictures/Picture/love2.jpg";
@BeforeClass
public static void setUpBeforeClass() throws Exception { } @Test
public void testWriteExcel() {
//## 重复利用 的对象 ##//
Workbook wb = null;
FileOutputStream fileOut = null;
CellStyle cellStyle = null;
Cell cell = null;
Font font = null; /**
* EXCEL早期版本
*/
try {
//## 创建早期EXCEL的Workbook ##//
wb = new HSSFWorkbook();
//## 获取HSSF和XSSF的辅助类 ##//
CreationHelper createHelper = wb.getCreationHelper();
//## 创建一个名为“New Sheet”的Sheet ##//
Sheet sheet = wb.createSheet("New Sheet"); /** 第一行 --- CELL创建,数据填充及日期格式 **/
Row row1 = sheet.createRow(0);
//Cell cell = row.createCell(0);
//cell.setCellValue(1); //## 在相应的位置填充数据 ##//
row1.createCell(0).setCellValue(1);
row1.createCell(1).setCellValue(1.2);
row1.createCell(2).setCellValue(createHelper.createRichTextString("CreationHelper---字符串"));
row1.createCell(3).setCellValue(true); //## 填充日期类型的数据---未设置Cell Style ##//
row1.createCell(4).setCellValue(new Date());
//## 填充日期类型的数据---已设置Cell Style ##//
cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy年MM月dd日 hh:mm:ss"));
//cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("mm/dd/yyyy h:mm"));
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd hh:mm:ss"));
cell = row1.createCell(5);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);
//## 另一种创建日期的方法 ##//
/*cell = row1.createCell(6);
cell.setCellValue(Calendar.getInstance());
cell.setCellStyle(cellStyle);*/ /** 第二行 --- 数据类型 **/
Row row2 = sheet.createRow(1);
row2.createCell(0).setCellValue(1.1);
row2.createCell(1).setCellValue(new Date());
row2.createCell(2).setCellValue(Calendar.getInstance());
row2.createCell(3).setCellValue("字符串");
row2.createCell(4).setCellValue(true);
//## 错误的CELL数据格式 ##//
row2.createCell(5).setCellType(HSSFCell.CELL_TYPE_ERROR); /** 第三行 --- CELL的各种对齐方式 **/
Row row3 = sheet.createRow(2);
row3.setHeightInPoints(30);
//## 水平居中,底端对齐 ##//
createCell(wb, row3, (short)0, XSSFCellStyle.ALIGN_CENTER, XSSFCellStyle.VERTICAL_BOTTOM);
//## 水平居中,垂直居中 ##//
createCell(wb, row3, (short)1, XSSFCellStyle.ALIGN_CENTER_SELECTION, XSSFCellStyle.VERTICAL_BOTTOM);
//## 填充 ,垂直居中 ##//
createCell(wb, row3, (short)2, XSSFCellStyle.ALIGN_FILL, XSSFCellStyle.VERTICAL_CENTER);
//## 左对齐,垂直居中 ##//
createCell(wb, row3, (short)3, XSSFCellStyle.ALIGN_GENERAL, XSSFCellStyle.VERTICAL_CENTER);
//## 左对齐,顶端对齐 ##//
createCell(wb, row3, (short)4, XSSFCellStyle.ALIGN_JUSTIFY, XSSFCellStyle.VERTICAL_JUSTIFY);
//## 左对齐,顶端对齐 ##//
createCell(wb, row3, (short)5, XSSFCellStyle.ALIGN_LEFT, XSSFCellStyle.VERTICAL_TOP);
//## 右对齐,顶端对齐 ##//
createCell(wb, row3, (short)6, XSSFCellStyle.ALIGN_RIGHT, XSSFCellStyle.VERTICAL_TOP); /** 第四行 --- CELL边框 **/
Row row4 = sheet.createRow(3);
cell = row4.createCell(1);
cell.setCellValue(4);
cellStyle = wb.createCellStyle();
//## 设置底部边框为THIN ##//
cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
//## 设置底部边框颜色为黑色 ##//
cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
//## 设置左边边框为THIN ##//
cellStyle.setBorderLeft(CellStyle.BORDER_THIN);
//## 设置左边边框颜色为红色 ##//
cellStyle.setLeftBorderColor(IndexedColors.RED.getIndex());
//## 设置右边边框为THIN ##//
cellStyle.setBorderRight(CellStyle.BORDER_THIN);
//## 设置右边边框颜色为蓝色 ##//
cellStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
//## 设置顶部边框为MEDIUM DASHED ##//
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED);
//## 设置顶部边框颜色为黑色 ##//
cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
cell.setCellStyle(cellStyle); /** 第五行 --- 填充与颜色 **/
Row row5 = sheet.createRow((short) 4);
//## Aqua背景 ##//
cellStyle = wb.createCellStyle();
cellStyle.setFillBackgroundColor(IndexedColors.AQUA.getIndex());
//## 设置填充模式为BIG SPOTS ##//
cellStyle.setFillPattern(CellStyle.BIG_SPOTS);
cell = row5.createCell((short) 1);
cell.setCellValue("Aqua背景");
cell.setCellStyle(cellStyle); //## 橙色前景色(相对 于CELL背景) ##//
cellStyle = wb.createCellStyle();
cellStyle.setFillForegroundColor(IndexedColors.ORANGE.getIndex());
//## 设置填充模式为SOLID FOREGROUND ##//
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
cell = row5.createCell((short) 2);
cell.setCellValue("橙色前景色");
cell.setCellStyle(cellStyle); /** 第六行 --- 合并单元格 **/
Row row6 = sheet.createRow((short) 5);
cell = row6.createCell((short) 4);
cell.setCellValue("合并单元格测试");
//## Wrong:EXCEL 2007中打开workbook.xls文件看不到"合并单元格测试",但单元格已经合并了 ##//
/*sheet.addMergedRegion(new CellRangeAddress(
3, //first row (0-based)
5, //last row (0-based)
4, //first column (0-based)
6 //last column (0-based)
));*/
//## 正确合并单元格 注意:与上不同的是first row=last row ##//
sheet.addMergedRegion(new CellRangeAddress(
5, //first row (0-based)
5, //last row (0-based)
4, //first column (0-based)
6 //last column (0-based)
)); /** 第七行 --- 字体 **/
Row row7 = sheet.createRow(6);
//## 创建字体 ##//
//注意:POI限制一个Workbook创建的Font对象最多为32767,所以不要为每个CELL创建一个字体,建议重用字体
font = wb.createFont();
//## 设置字体大小为24 ##//
font.setFontHeightInPoints((short)24);
//## 设置字体样式为华文隶书 ##//
font.setFontName("华文隶书");
//## 斜体 ##//
font.setItalic(true);
//## 添加删除线 ##//
font.setStrikeout(true);
//## 将字体添加到样式中 ##//
cellStyle = wb.createCellStyle();
cellStyle.setFont(font);
cell = row7.createCell(1);
cell.setCellValue("字体测试");
cell.setCellStyle(cellStyle); /** 第八行 --- 自定义颜色 **/
Row row8 = sheet.createRow(7);
cell = row8.createCell(0);
cell.setCellValue("自定义颜色测试");
cellStyle = wb.createCellStyle();
//## 设置填充前景色为LIME ##//
cellStyle.setFillForegroundColor(HSSFColor.LIME.index);
//## 设置填充模式为SOLID FOREGROUND ##//
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
font = wb.createFont();
//## 设置字体颜色为红色 ##//
font.setColor(HSSFColor.RED.index);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle); /* cell.setCellValue("自定义颜色测试Palette");
//creating a custom palette for the workbook
HSSFPalette palette = ((HSSFWorkbook)wb).getCustomPalette();
//replacing the standard red with freebsd.org red
palette.setColorAtIndex(HSSFColor.RED.index,
(byte) 153, //RGB red (0-255)
(byte) 0, //RGB green
(byte) 0 //RGB blue
);
//replacing lime with freebsd.org gold
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);*/ /** 第九行 --- 换行 **/
Row row9 = sheet.createRow(8);
cell = row9.createCell(2);
cell.setCellValue("使用 /n及Word-wrap创建一个新行");
cellStyle = wb.createCellStyle();
//## 设置WrapText为true ##//
cellStyle.setWrapText(true);
cell.setCellStyle(cellStyle);
//## 设置行的高度以适应新行 ---两行##//
row9.setHeightInPoints((2*sheet.getDefaultRowHeightInPoints()));
//## 调整列宽 ##//
sheet.autoSizeColumn(2); /** 第十行 --- 数据格式 **/
DataFormat format = wb.createDataFormat(); Row row10 = sheet.createRow(9);
cell = row10.createCell(0);
cell.setCellValue(11111.25);
cellStyle = wb.createCellStyle();
//## 一位小数 ##//
cellStyle.setDataFormat(format.getFormat("0.0"));
cell.setCellStyle(cellStyle); cell = row10.createCell(1);
cell.setCellValue(11111.25);
cellStyle = wb.createCellStyle();
//## 四位小数,千位逗号隔开 ##//
// #,###.0000效果一样
cellStyle.setDataFormat(format.getFormat("#,##0.0000"));
cell.setCellStyle(cellStyle); //## 将文件写到硬盘上 ##//
fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} /**
* EXCEL 2007及以后
*/
/* try {
wb = new XSSFWorkbook();
wb.createSheet("sheet1");
Cell cell = row.createCell( 0);
cell.setCellValue("custom XSSF colors");
CellStyle style1 = wb.createCellStyle();
style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128)));
style1.setFillPattern(CellStyle.SOLID_FOREGROUND);
fileOut = new FileOutputStream("d:/workbook.xlsx");
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}*/ }
/**
* 创建相应格式的CELL
*/
public void createCell(Workbook wb, Row row, short column, short halign, short valign) {
Cell cell = row.createCell(column);
//## 给CELL赋值 ##//
cell.setCellValue("对齐排列");
CellStyle cellStyle = wb.createCellStyle();
//## 设置水平对齐方式 ##//
cellStyle.setAlignment(halign);
//## 设置垂直对齐方式 ##//
cellStyle.setVerticalAlignment(valign);
//## 添加CELL样式 ##//
cell.setCellStyle(cellStyle);
} /**
* 测试POI EXCEL迭代和或CELL中的值
*/
@Test
public void testExcelIteratorAndCellContents() {
try {
//## 创建HSSFWorkbook实例 ##//
Workbook wb = new HSSFWorkbook(new FileInputStream(XLS_WORKBOOK_LOCATION));
//## 获得第一个SHEET ##//
Sheet sheet = wb.getSheetAt(0); // or we could cast into HSSFSheet,that doesn't matter
/** 第一种迭代方法 **/
/*
//## 迭代ROW ##//
for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext(); ) {
Row row = rit.next();
//## 迭代CELL ##//
for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext(); ) {
Cell cell = cit.next();
System.out.println(cell);
}
}
*/
/** 第二种迭代方法 **/
for (Row row : sheet) {
for (Cell cell : row) {
//## 获取CellReference对象 ##/
CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
System.out.print(cellRef.formatAsString());
System.out.print(" - ");
//## 根据CELL值类型进行相应处理 ##/
switch(cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.println(cell.getRichStringCellValue().getString());
break;
case Cell.CELL_TYPE_NUMERIC:
//## yyyy年mm月dd日 hh:mm:ss此种格式日期不能识别 ##//
//## mm/dd/yyyy h:mm,yyyy-MM-dd hh:mm:ss可以识别,估计是POI对中文日期支持不怎么好的问题 ##//
if(DateUtil.isCellDateFormatted(cell)) {
System.out.println(cell.getDateCellValue());
} else {
System.out.println(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
System.out.println(cell.getCellFormula());
break;
case Cell.CELL_TYPE_ERROR:
System.out.println(cell.getErrorCellValue());
break;
default:
System.out.println();
}
}
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 修改文件测试
*/
@Test
public void testReadingAndRewritingWorkbooks() {
InputStream inp = null;
try {
inp = new FileInputStream(XLS_WORKBOOK_LOCATION);
//inp = new FileInputStream("workbook.xlsx");
//## 获得要修改的Workbook ##/
Workbook wb = WorkbookFactory.create(inp);
//## 获取要修改的Sheet ##//
Sheet sheet = wb.getSheetAt(0);
//## 获取要修改的Row ##//
Row row = sheet.getRow(1);
//## 获取要修改的Cell,如果没有相应位置的Cell那么就创建一个 ##//
Cell cell = row.getCell(2);
if (cell == null)
cell = row.createCell(2);
//## 写入修改数据 ##//
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("修改文件测试"); //## 将文件写到硬盘上 ##//
FileOutputStream fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 暂时没看到有什么区别
*/
@Test
public void testFitSheetToOnePage() {
try {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("format sheet");
PrintSetup ps = sheet.getPrintSetup(); sheet.setAutobreaks(true); ps.setFitHeight((short)1);
ps.setFitWidth((short)1);
// Create various cells and rows for spreadsheet.
FileOutputStream fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch(Exception e) {
e.printStackTrace();
}
} /**
* 设置打印区域测试
*/
@Test
public void testSetPrintArea() {
/**
* 注意:我测试的时候用的是EXCEL 2007打开的,效果不明显,只能控制列且列好像也是不正确的。
* 但是我用EXCEL 2007转换了一下,xls,xlsx的都正确了,目前还不知道是什么问题。
*/
try {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Print Area Sheet");
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("第一个单元格");
row.createCell(1).setCellValue("第二个单元格");
row.createCell(2).setCellValue("第三个单元格");
row = sheet.createRow(1);
row.createCell(0).setCellValue("第四个单元格");
row.createCell(1).setCellValue("第五个单元格");
row = sheet.createRow(2);
row.createCell(0).setCellValue("第六个单元格");
row.createCell(1).setCellValue("第七个单元格");
//## 设置打印区域 A1--C2 ##//
//wb.setPrintArea(0, "$A$1:$C$2");
//## 或者使用以下方法设置 ##//
wb.setPrintArea(
0, //Sheet页
0, //开始列
2, //结束列
0, //开始行
1 //结束行
); FileOutputStream fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 设置页脚测试
* 用“页面布局”可以看到效果
* 下列代码只适用xls
*/
@Test
public void testSetPageNumbersOnFooter() {
try {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Footer Test");
//## 获得页脚 ##/
HSSFFooter footer = sheet.getFooter();
Row row;
//## 将 当前页/总页数 写在右边 ##/
footer.setRight( HSSFFooter.page() + "/" + HSSFFooter.numPages() );
for(int i = 0; i < 100; i++) {
row = sheet.createRow(i);
for(int j = 0; j < 20; j++) {
row.createCell(j).setCellValue("A" + i + j);
}
}
FileOutputStream fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 测试一些POI提供的比较方便的函数
* 文档中有些以HSSF为前缀的类的方法以过时(e.g: HSSFSheet, HSSFCell etc.),
* 测试的时候我去掉了HSSF前缀,当然也就是现在POI推荐的接口(Sheet,Row,Cell etc.)
*/
@Test
public void testConvenienceFunctions() {
try {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet( "Convenience Functions" );
//## 设置Sheet的显示比例 这里是3/4,也就是 75% ##//
sheet1.setZoom(3, 4);
//## 合并单元格 ##//
Row row = sheet1.createRow((short) 1 );
Row row2 = sheet1.createRow((short) 2 );
Cell cell = row.createCell((short) 1 );
cell.setCellValue( "合并单元格测试" );
//## 创建合并区域 ##//
CellRangeAddress region = new CellRangeAddress( 1, (short) 1, 4, (short) 4 );
sheet1.addMergedRegion(region); //## 设置边框及边框颜色 ##//
final short borderMediumDashed = CellStyle.BORDER_MEDIUM_DASHED;
RegionUtil.setBorderBottom( borderMediumDashed,
region, sheet1, wb );
RegionUtil.setBorderTop( borderMediumDashed,
region, sheet1, wb );
RegionUtil.setBorderLeft( borderMediumDashed,
region, sheet1, wb );
RegionUtil.setBorderRight( borderMediumDashed,
region, sheet1, wb );
//## 设置底部边框的颜色 ##//
RegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);
//## 设置顶部边框的颜色 ##//
RegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);
//## 设置左边边框的颜色 ##//
RegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);
//## 设置右边边框的颜色 ##//
RegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); //## CellUtil的一些用法 ##/
CellStyle style = wb.createCellStyle();
style.setIndention((short)10);
CellUtil.createCell(row, 8, "CellUtil测试", style);
Cell cell2 = CellUtil.createCell( row2, 8, "CellUtil测试");
//## 设置对齐方式为居中对齐 ##//
CellUtil.setAlignment(cell2, wb, CellStyle.ALIGN_CENTER); //## 将Workbook写到硬盘上 ##//
FileOutputStream fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 测试冻结窗格和拆分
*/
@Test
public void testSplitAndFreezePanes() {
try {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("冻结首行Sheet");
Sheet sheet2 = wb.createSheet("冻结首列Sheet");
Sheet sheet3 = wb.createSheet("冻结两行两列 Sheet");
Sheet sheet4 = wb.createSheet("拆分Sheet"); /** 冻结窗格 **/
/*
createFreezePane( colSplit, rowSplit, topRow, leftmostColumn )
colSplit 冻结线水平位置
rowSplit 冻结线垂直位置
topRow Top row visible in bottom pane
leftmostColumn Left column visible in right pane.
*/
//## 冻结首行 ##//
sheet1.createFreezePane( 0, 1, 0, 1 );
//## 冻结首列 ##//
sheet2.createFreezePane( 1, 0, 1, 0 );
//## 冻结两行两列 ##//
sheet3.createFreezePane( 2, 2 );
//## 拆分,左下的为面板为激活状态 ##//
sheet4.createSplitPane( 2000, 2000, 0, 0, Sheet.PANE_LOWER_LEFT ); FileOutputStream fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 测试简单图形
*/
@Test
public void testDrawingShapes() {
try {
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("Drawing Shapes");
//## 得到一个HSSFPatriarch对象,有点像画笔但是注意区别 ##//
HSSFPatriarch patriarch = (HSSFPatriarch)sheet.createDrawingPatriarch();
/* 构造器:
* HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)
* 描述:
* 创建HSSFClientAnchor类的实例,设置该anchor的顶-左和底-右坐标(相当于锚点,也就是图像出现的位置,大小等).
* Creates a new client anchor and sets the top-left and bottom-right coordinates of the anchor.
* 参数:
* dx1 第一个单元格的x坐标
* dy1 第一个单元格的y坐标
* dx2 第二个单元格的x坐标
* dy2 第二个单元格的y坐标
* col1 第一个单元格所在列
* row1 第一个单元格所在行
* col2 第二个单元格所在列
* row2 第二个单元格所在行
*/
HSSFClientAnchor anchor = new HSSFClientAnchor( 0, 0, 512, 255, (short) 1, 0, (short) 1, 0 );
//## 通过HSSFClientAnchor类的对象创建HSSFSimpleShape的实例 ##//
HSSFSimpleShape shape = patriarch.createSimpleShape(anchor);
//## 画个椭圆 ##//
shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); //## 这几个是没问题的 ##//
//shape.setLineStyleColor(10,10,10);
//shape.setFillColor(90,10,200);
//shape.setLineStyleColor(HSSFColor.BLUE.index); //设置不了,尚不知原因
//## 设置线条颜色为红色 ##//
//shape.setLineStyleColor(Color.BLUE.getRGB()); //搞不清楚为什是反的BLUE:红色 RED:蓝色,是不是开发POI的有点色盲,JUST KIDDING!
//## 设置填充颜色为灰色 ##//
shape.setFillColor(Color.GRAY.getRGB()); //这个又可以
//## 设置线条宽度为3pt ##//
shape.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3);
//## 设置线条的样式为点式 ##//
shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); //## 创建文本框并填充文字 “创建文本框” ##//
HSSFTextbox textbox = patriarch.createTextbox(
new HSSFClientAnchor(0,0,0,0,(short)1,1,(short)2,2));
RichTextString text = new HSSFRichTextString("创建文本框");
//## 创建字体 ##//
Font font = wb.createFont();
//## 斜体 ##//
font.setItalic(true);
//## 设置字体颜色为蓝色 ##//
//font.setColor((short)Color.BLUE.getBlue()); not work
font.setColor(HSSFColor.BLUE.index);
//## 添加字体 ##//
text.applyFont(font);
textbox.setString(text); //## 将文件写到硬盘上 ##//
FileOutputStream fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 添加图片到工作薄测试
* 已测试PNG,JPG,GIF
*/
@Test
public void testImages() {
try {
//## 创建一个新的工作薄 ##//
Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook(); //## 添加图片到该工作薄 ##//
InputStream is = new FileInputStream(IMAGE_LOCATION);
byte[] bytes = IOUtils.toByteArray(is);
int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
is.close(); CreationHelper helper = wb.getCreationHelper(); //## 创建一个名为“添加图片”的Sheet ##//
Sheet sheet = wb.createSheet("添加图片"); //## 创建一个DrawingPatriarch实例 ##//
Drawing drawing = sheet.createDrawingPatriarch(); //## 设置图片的形状,位置等 ##//
ClientAnchor anchor = helper.createClientAnchor();
//set top-left corner of the picture,
//subsequent call of Picture#resize() will operate relative to it
anchor.setCol1(3);
anchor.setRow1(2);
Picture pict = drawing.createPicture(anchor, pictureIdx);
//## 自动设置图片的大小 注意:只支持PNG,JPG,GIF(BMP未测试)##//
pict.resize(); //## 保存Workbook ##//
String file = "picture.xls";
if(wb instanceof XSSFWorkbook) file += "x";
FileOutputStream fileOut = new FileOutputStream(XLS_OR_XLSX_DIR + file);
wb.write(fileOut);
fileOut.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}
java 使用POI读写Excel文件(兼容2003、2007)的更多相关文章
- java使用POI实现excel文件的读取,兼容后缀名xls和xlsx
需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...
- 《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)
1.简介 在自动化测试,有些我们的测试数据是放到excel文件中,尤其是在做数据驱动测试的时候,所以需要懂得如何操作获取excel内的内容.由于java不像python那样有直接操作Excle文件的类 ...
- 《手把手教你》系列技巧篇(六十七)-java+ selenium自动化测试 - 读写excel文件 - 中篇(详细教程)
1.简介 前面介绍了POI可以操作excel,也简单的提到另一个操作excle的工具,本篇介绍一个其他的可以操作excel的工具,但是这个工具有一个前提,excel文件版本只能是97-2003版本,如 ...
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...
- JAVA使用POI读取EXCEL文件的简单model
一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...
- 《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)
1.简介 今天继续操作Excle,小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle,今天不介绍了,有两种就够用了,其实一种就够用了,今天主要是来介绍如何使用不同的数据类型读取Excel文件 ...
- java通过poi编写excel文件
public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- Apache POI 读写 Excel 文件
目录 写入 Excel 文件 读取 Excel 文件 遍历 Excel 文件 需要的 maven 依赖 完整代码 写入 Excel 文件 // 写入 Excel 文件 // ============= ...
随机推荐
- html 列表相关信息
无序列表 无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圆标记) 无序列表始于<ul>标签.每个列表项始于<li> <ul> <li> ...
- html <form>相关表单
action属性规定提交表单时,向何处发送表单数据 radio 分组 只要name一样,就是一组,即一组中只能选择一个. <input type="radio" id=&qu ...
- POJ 3685 Matrix 二分 函数单调性 难度:2
Memory Limit: 65536K Total Submissions: 4637 Accepted: 1180 Description Given a N × N matrix A, ...
- Python Django 前后端数据交互 之 HTTP协议下GET与POST的区别
99%的人都理解错了HTTP中GET与POST的区别(转自知乎) 作者:Larry链接:https://zhuanlan.zhihu.com/p/22536382来源:知乎著作权归作者所有.商业转 ...
- Cetus
转自:https://github.com/Lede-Inc/cetus Cetus 简介 Cetus是由C语言开发的关系型数据库MySQL的中间件,主要提供了一个全面的数据库访问代理功能.Cetus ...
- VMware Station NAT上网模式配置
- koa 框架 介绍 -- 待续
对比 express 更小 更健壮 解决繁琐的回调函数嵌套, 并极大地提升错误处理的效率 Koa 的核心设计思路是为中间件层 提供高级语法糖封装, (其实就是用了 ES6的生成器, 能中断函数的执 ...
- 配置ssh互信的一个小问题记录
在我们安装集群软件时,经常需要配置机器之间的互信,每个人也有一套自己熟悉的方法. 但是在今天配置互信过程中,发现操作过程还是一样,但是就是不能互信,通过查找资料解决了,做一下记录. 我经常使用的方式: ...
- ztree树形菜单的增加删除修改和换图标
首先需要注意一点,如果有研究过树形菜单,就会发现实现删除和修改功能特别简单,但是增加却有一点复杂.造成这个现象是ztree树形菜单的历史遗留问题.大概是之前的版本没有增加这个功能,后来的版本加上了这个 ...
- PAT 天梯赛 是否同一棵二叉搜索树 (25分)(二叉搜索树 指针)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...