POI报表技术
1.导入Apache POI的JAR包
(Apache官网中可以直接下载)POI JAR 包
2.熟悉常用对象
- HSSFSheet excel的表单
- HSSFRow excel的行
- HSSFCell excel的格子单元
- HSSFFont excel字体
- HSSFDataFormat 日期格式
- HSSFHeader sheet头
- HSSFFooter sheet尾
- HSSFCellStyle cell样式
- HSSFDateUtil 日期
- HSSFPrintSetup 打印
- HSSFErrorConstants 错误信息表
3.简单范例练练手
生成一个空白的Excel表格
public class ExcelSample1 {
public static void main(String[] args) throws IOException {
//创建一个excel文件
HSSFWorkbook wb= new HSSFWorkbook();
FileOutputStream fileOut= new FileOutputStream("c:\\workbook.xls");
// FileOutputStream fileOut= new FileOutputStream("c:/workbook.xls");
wb.write(fileOut);
fileOut.close();
}
}
4.生成一个具有内容和格式的表格
public class CreateCells
{
public static void main(String[] args) throws IOException
{
HSSFWorkbook wb = new HSSFWorkbook(); //建立新HSSFWorkbook对象
HSSFSheet sheet = wb.createSheet("new sheet"); //建立新的sheet对象
HSSFRow row = sheet.createRow((short)0);
//在sheet里创建一行,参数为行号(第一行,此处可想象成数组)
HSSFCell cell = row.createCell((short)0);
//在row里建立新cell(单元格),参数为列号(第一列)
cell.setCellvalue(1); //设置cell的整数类型的值
row.createCell((short)1).setCellvalue(1.2); //设置cell浮点类型的值
row.createCell((short)2).setCellvalue("test"); //设置cell字符类型的值
row.createCell((short)3).setCellvalue(true); //设置cell布尔类型的值
HSSFCellStyle cellStyle = wb.createCellStyle(); //建立新的cell样式
cellStyle.setDataFormat(HSSFDataFormat. getBuiltinFormat("m/d/yy h:mm"));
//设置cell样式为定制的日期格式
HSSFCell dCell =row.createCell((short)4);
dCell.setCellvalue(new Date()); //设置cell为日期类型的值
dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式
HSSFCell csCell =row.createCell((short)5);
csCell.setEncoding(HSSFCell.ENCODING_UTF_16);
//设置cell编码解决中文高位字节截断
csCell.setCellvalue("中文测试_Chinese Words Test"); //设置中西文结合字符串
row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);
//建立错误cell
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
}
}
当然,还有一些其他使用的方法,比如说,
合并单元格:sheet.addMergedRegion(new Region(1,(short)1,2,(short)4));
设置对齐方式:HSSFCellStyle cellstyle = wb.createCellStyle();
cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
冻结一个窗口:sheet.createFreezePane(1,2);
(说实话,不知道这个有什么作用!-_-)
5.将数据库中的数据导出,生成一个Excel表格
1.写一个继承的方法类:
import java.io.OutputStream;
import java.util.ArrayList;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ExcelFileGenerator {
private final int SPLIT_COUNT = 1500; // Excel每个工作簿的行数
private ArrayList fieldName = null; // excel标题数据集(ArrayList里存放的是字符串)
private ArrayList fieldData = null; // excel数据内容(ArrayList里存放的是List集合元素)
private HSSFWorkbook workBook = null;
/**
* 构造器
*
* @param fieldName
* 结果集的字段名
* @param data
*/
public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) {
this.fieldName = fieldName;
this.fieldData = fieldData;
}
/**
* 创建HSSFWorkbook对象
*
* @return HSSFWorkbook
*/
public HSSFWorkbook createWorkbook() {
workBook = new HSSFWorkbook();
int rows = fieldData.size();
int sheetNum = 0;
if (rows % SPLIT_COUNT == 0) {
sheetNum = rows / SPLIT_COUNT;
} else {
sheetNum = rows / SPLIT_COUNT + 1;
}
for (int i = 1; i <= sheetNum; i++) {// 创建sheet
HSSFSheet sheet = workBook.createSheet("Page " + i);
HSSFRow headRow = sheet.createRow((short) 0); // 创建Row
for (int j = 0; j < fieldName.size(); j++) {// 创建Cell
HSSFCell cell = headRow.createCell((short) j);
// 添加样式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 防止中文高位截断
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
if (fieldName.get(j) != null) {
cell.setCellValue((String) fieldName.get(j));
} else {
cell.setCellValue("-");
}
}
for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) {
HSSFRow row = sheet.createRow((short) (k + 1));
// 将数据内容放入excel单元格(filedData内存放的为集合元素,所以可以转型为ArrayList)
ArrayList rowList = (ArrayList) fieldData.get((i - 1) * SPLIT_COUNT + k);
for (int n = 0; n < rowList.size(); n++) {
HSSFCell cell = row.createCell((short) n);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
if (rowList.get(n) != null) {
cell.setCellValue((String) rowList.get(n).toString());
} else {
cell.setCellValue("");
}
}
}
}
return workBook;
}
public void expordExcel(OutputStream os) throws Exception {
workBook = createWorkbook();
workBook.write(os);
os.close();
}
}
2.模仿从数据库中取得的数据,进行操作
package demo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import oracle.net.aso.l;
public class TestExcelFileGenerator {
public static void main(String[] args) throws Exception {
ArrayList<String> fieldName=new ArrayList<>();
fieldName.add("名字");
fieldName.add("学号");
fieldName.add("地址");
ArrayList fieldData=new ArrayList();
List list=new ArrayList<>();
List list2=new ArrayList<>();
List list3=new ArrayList<>();
//定义一个User对象,这个就明显可以从数据库中取得
User user=new User("cole","123","cc");
User user2=new User("steve", "123", "bb");
User user3=new User("red", "123", "dd");
list.add(user.getName());
list.add(user2.getNumber());
list.add(user3.getAddress());
fieldData.add(list);
list2.add(user.getName());
list2.add(user2.getNumber());
list2.add(user3.getAddress());
fieldData.add(list2);//fieldData存储的数据类型是一个集合类型,其一个数据就代表一行
ExcelFileGenerator fileGenerator=new ExcelFileGenerator(fieldName, fieldData);
OutputStream os=new FileOutputStream(new File("D:/test/users.xls"));
fileGenerator.expordExcel(os);
}
}
PS:报表技术在实际开发中还是有一定的需求的。有任何问题,欢迎进行交流。