Java POI 操作Excel 应用(一)

此应用是利用POI动态生成复杂表头,结果如下


首先介绍几个重要的类

org.apache.poi.hssf.usermodel.HSSFWorkbook;//工作簿
org.apache.poi.hssf.usermodel.HSSFSheet;   //sheet页
org.apache.poi.hssf.usermodel.HSSFRow;     //行
org.apache.poi.hssf.usermodel.HSSFCell;    //单元格 

以上是创建一个Excel文档必不可少的类。

图构造:

HSSFWorkbook workBook = new HSSFWorkbook();//创建一个工作薄对象
HSSFSheet sheet = workBook.createSheet("Page 1");//创建sheet页
HSSFRow headRow = sheet.createRow((short) 1);//创建标题行 
//设置单元格范围
CellRangeAddress cra0 = new CellRangeAddress(1,(short)(7),0,0);
CellRangeAddress cra1 = new CellRangeAddress(1,(short)2,(short)(1),(short)1);
CellRangeAddress cra2 = new CellRangeAddress(1,(short)2,(short)(2),(short)2);
CellRangeAddress cra3 = new CellRangeAddress(1,(short)2,(short)(3),(short)3);
CellRangeAddress cra4 = new CellRangeAddress(1, 1, 4, 6);
CellRangeAddress cra7 = new CellRangeAddress(1,(short)2,(short)(7),(short)7);
CellRangeAddress cra8 = new CellRangeAddress(1,(short)2,(short)(8),(short)8);
                     
//设置边框工具类
public void setBorder(CellRangeAddress cellRangeAddress, Sheet sheet,  
            Workbook wb) throws Exception {  
        RegionUtil.setBorderLeft(1, cellRangeAddress, sheet, wb);  
        RegionUtil.setBorderBottom(1, cellRangeAddress, sheet, wb);  
        RegionUtil.setBorderRight(1, cellRangeAddress, sheet, wb);  
        RegionUtil.setBorderTop(1, cellRangeAddress, sheet, wb);  
          
}  


//根据单元格范围合并单元格
sheet.addMergedRegion(cra0);
sheet.addMergedRegion(cra1);
sheet.addMergedRegion(cra2);
sheet.addMergedRegion(cra3);
sheet.addMergedRegion(cra4);
sheet.addMergedRegion(cra5);
sheet.addMergedRegion(cra6);
sheet.addMergedRegion(cra7);
sheet.addMergedRegion(cra8);
    //设置边框
    this.setBorder(cra0, sheet, workBook);
this.setBorder(cra1, sheet, workBook);
this.setBorder(cra2, sheet, workBook);
this.setBorder(cra3, sheet, workBook);
this.setBorder(cra4, sheet, workBook);
this.setBorder(cra5, sheet, workBook);
this.setBorder(cra6, sheet, workBook);
this.setBorder(cra7, sheet, workBook);
this.setBorder(cra8, sheet, workBook);
ArrayList<String> fieldName = DataSource.getTableName();     
for (int j = 0; j < fieldName.size(); j++) {//循环excel的标题
cell = headRow.createCell(j);//使用行对象创建列对象,0表示第1列

/**************对标题添加样式begin********************/

//设置列的宽度/
sheet.setColumnWidth(j, 6000);
cellStyle = workBook.createCellStyle();//创建列的样式对象

//设置内容居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//设置列样式
cell.setCellStyle(cellStyle);
HSSFFont font = workBook.createFont();//创建字体对象
//字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
cellStyle.setFont(font);

/**************对标题添加样式end********************/
String ch_title = "三座标";
//添加样式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
if(fieldName.get(j) != null){
//将创建好的样式放置到对应的单元格中
cell.setCellStyle(cellStyle);
if(j!=4&&j!=5&&j!=6){
	cell.setCellValue((String) fieldName.get(j));//为标题中的单元格设置值
}else{
    cell.setCellValue(ch_title);						
}
}else{
cell.setCellValue("-");
}
}
headRow = sheet.createRow((short) 1);
//设置x,y,z表头
for (int j = 4; j < 7; j++) {
cell = headRow.createCell(j);
cell.setCellValue(fieldName.get(j));
cell.setCellStyle(cellStyle);
}

//表头下部(特征)
headRow = sheet.createRow((short)(rows+4));
cell = headRow.createCell(1);
cell.setCellValue("特征");
cell.setCellStyle(cellStyle);

下面要注意数据源转化:

对于Java开发,一般拿到的数据都是对象化的,而我们需要的是对象的属性转换为String直接写入到对应的excel单元格中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章