Java操作Excel Poi简介

 

一. POI

Jakarta POI apache的子目,目ole2象。它提供了一Windows文档的Java API

目前比成熟的是HSSF接口,MS Excel97-2002象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换西,而是真正的Excel象,你可以控制一些属性如sheet,cell等等。

二.HSSF概况

HSSF Horrible SpreadSheet Format写,也即讨厌子表格格式。也HSSF的名字有点滑稽,就本而言它是一个非常严肃、正API。通HSSF,你可以用Java取、写入、修改Excel文件。

HSSF 为读取操作提供了两APIusermodeleventusermodel,即模型事件-模型。前者很好理解,后者比抽象,但操作效率要高得多

三.开始编码

1 . 准

要求:JDK 1.4+POI

2 EXCEL

HSSFWorkbook excell 文档象介
HSSFSheet excell
的表
HSSFRow excell
的行
HSSFCell excell
的格子
HSSFFont excell
字体
HSSFName
名称
HSSFDataFormat
日期格式
poi1.7中才有以下2
HSSFHeader sheet

HSSFFooter sheet


HSSFCellStyle cell

助操作包括
HSSFDateUtil
日期
HSSFPrintSetup
打印
HSSFErrorConstants
错误信息

3 .具体用法 (采用 usermodel

如何Excel

Excel文件,首先生成一个POIFSFileSystem象,由POIFSFileSystem象构造一个HSSFWorkbookHSSFWorkbook象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串:



POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));    
HSSFWorkbook
 wb = new HSSFWorkbook(fs);    
  } catch (IOException e) {    
  e.printStackTrace();    
  }    
  HSSFSheet sheet = wb.getSheetAt(0);    
  HSSFRow row = sheet.getRow(0);    
  HSSFCell cell = row.getCell((short) 0);    
  String msg = cell.getStringCellValue();  
POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));    
HSSFWorkbook
 wb = new HSSFWorkbook(fs);    
  } catch (IOException e) {    
  e.printStackTrace();    
  }    
  HSSFSheet sheet = wb.getSheetAt(0);    
  HSSFRow row = sheet.getRow(0);    
  HSSFCell cell = row.getCell((short) 0);    
  String msg = cell.getStringCellValue();  
如何写excel

excel的第一个表一行的第一个元格的写成“a test”


POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls"));    
  
    HSSFWorkbook wb = new HSSFWorkbook(fs);    
  
    HSSFSheet sheet = wb.getSheetAt(0);    
  
    HSSFRow row = sheet.getRow(0);    
  
    HSSFCell cell = row.getCell((short)0);    
  
    cell.setCellValue("a test");    
  
    // Write the output to a file    
  
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
  
    wb.write(fileOut);    
  
fileOut.close();  
4
. 可参考文档

初学者如何快速上手使用POI HSSF

里面有很多例子代,可以很方便上手

1、遍workbook

// load
源文件   
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath));   
HSSFWorkbook wb = new HSSFWorkbook(fs);   
for (int i = 0; i < wb.getNumberOfSheets(); i++) {   
    HSSFSheet sheet = wb.getSheetAt(i);   
    for (int i = sheet.getFirstRowNum(); i < sheet.getLastRowNum(); i ++) {   
    HSSFRow row = sheet.getRow(i);   
            if (row != null) {   
       
。。。操作}   
       }   
     }   
//
文件   
FileOutputStream fos = new FileOutputStream(objectPath);   
//
写文件   
swb.write(fos);   
fos.close(); 
2
、得到列和元格

HSSFRow row = sheet.getRow(i);   
HSSFCell cell = row.getCell((short) j); 
3
sheet名称和元格内容中文

wb.setSheetName(n, "
中文",HSSFCell.ENCODING_UTF_16);       
cell.setEncoding((short) 1);   
cell.setCellValue("
中文"); 
4
元格内容未公式或数,可以这样读

cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);   
cell.getNumericCellValue() 

5置列、行高

sheet.setColumnWidth((short)column,(short)width);   
row.setHeight((short)height); 

6、添加区域,合并元格

Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo,(short)columnTo);   
sheet.addMergedRegion(region);   
//
得到所有区域   
sheet.getNumMergedRegions() 
7
、常用方法
根据元格不同属性返回字符串数

public String getCellStringValue(HSSFCell cell) {   
        String cellValue = "";   
        switch (cell.getCellType()) {   
        case HSSFCell.CELL_TYPE_STRING:   
            cellValue = cell.getStringCellValue();   
            if(cellValue.trim().equals("")||cellValue.trim().length()<=0)   
                cellValue=" ";   
            break;   
        case HSSFCell.CELL_TYPE_NUMERIC:   
            cellValue = String.valueOf(cell.getNumericCellValue());   
            break;   
        case HSSFCell.CELL_TYPE_FORMULA:   
            cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);   
            cellValue = String.valueOf(cell.getNumericCellValue());   
            break;   
        case HSSFCell.CELL_TYPE_BLANK:   
            cellValue=" ";   
            break;   
        case HSSFCell.CELL_TYPE_BOOLEAN:   
            break;   
        case HSSFCell.CELL_TYPE_ERROR:   
            break;   
        default:   
            break;   
        }   
        return cellValue;   
    } 


8
、常用元格框格式
线HSSFCellStyle.BORDER_DOTTED
实线HSSFCellStyle.BORDER_THIN

public static HSSFCellStyle getCellStyle(short type)   
    {      
       HSSFWorkbook wb = new HSSFWorkbook();   
       HSSFCellStyle style = wb.createCellStyle();   
       style.setBorderBottom(type);//
    
        style.setBorderLeft(type);//
    
        style.setBorderRight(type);//
    
        style.setBorderTop(type);//
    
       return style;   
    } 


9
置字体和内容位


HSSFFont f  = wb.createFont();   
f.setFontHeightInPoints((short) 11);//
字号   
f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//
加粗   
style.setFont(f);   
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//
左右居中   
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//
上下居中   
style.setRotation(short rotation);//
元格内容的旋的角度   
HSSFDataFormat df = wb.createDataFormat();   
style1.setDataFormat(df.getFormat("0.00%"));//
元格数据格式   
cell.setCellFormula(string);//
给单元格公式   
style.setRotation(short rotation);//
元格内容的旋的角度   
cell.setCellStyle(style);  


10
、插入
论坛里看到


//
先把读进来的片放到一个ByteArrayOutputStream中,以便ByteArray   
      ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();   
      BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));   
      ImageIO.write(bufferImg,"jpg",byteArrayOut);   
//
读进一个excel模版   
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");    
fs = new POIFSFileSystem(fos);   
//
建一个工作薄   
HSSFWorkbook wb = new HSSFWorkbook(fs);   
HSSFSheet sheet = wb.getSheetAt(0);   
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();   
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);        
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); 
11
置列自动换

   HSSFCellStyle cellStyle =  workbook.createCellStyle();
   cellStyle.setWrapText(true);
   sheet.setDefaultColumnStyle((short)0, cellStyle);

    置列的

   sheet.setColumnWidth((short)0,(short)9000);

  sheet.setDefaultColumnStyle((short)0, cellStyle);

 

  sheet.setDefaultColumnWidth((short)70);冲突

  只会 不会置列

package testpoi;


import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;


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;

import org.apache.poi.hssf.util.Region;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;

/**

 * 将某SHEET中的某几行复制到某SHEET的某几行中。抱括被合并了的元格

 */

public class RowCopy {
/**

* @param args

* @throws IOException

* @throws FileNotFoundException

*/
@SuppressWarnings("deprecation")

public static void main(String[] args) {

try {

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(

"d://exlsample.xls"));

HSSFWorkbook wb = new HSSFWorkbook(fs);


// source
sheet ,targetsheet

copyRows(wb, "source", "target", 5, 6, 20);

FileOutputStream fileOut = new FileOutputStream("d://exlsample.xls");

wb.write(fileOut);

fileOut.flush();

fileOut.close();

System.out.println("Operation finished");

} catch (Exception e) {

e.printStackTrace();

}

}

* @param wb HSSFWorkbook

* @param pSourceSheetName sheet

* @param pTargetSheetName sheet

* @param pStartRow sheet中的起始

* @param pEndRow  sheet中的

* @param pPosition sheet中的开始

*/

public static void copyRows(HSSFWorkbook wb, String pSourceSheetName,

String pTargetSheetName, int intStartRow, int intEndRow, int intPosition) {

// EXECL中的行是从1开始的,而POI中是从0开始的,所以里要减1.

int pStartRow = intStartRow - 1;

int pEndRow = intEndRow - 1;

int pPosition = intPosition - 1;

HSSFRow sourceRow = null;

HSSFRow targetRow = null;

HSSFCell sourceCell = null;

HSSFCell targetCell = null;

HSSFSheet sourceSheet = null;

HSSFSheet targetSheet = null;

Region region = null;

int cType;

int i;

int j;

int targetRowFrom;

int targetRowTo;


if ((pStartRow == -1) || (pEndRow == -1)) {

return;

}

sourceSheet = wb.getSheet(pSourceSheetName);

targetSheet = wb.getSheet(pTargetSheetName);

System.out.println(sourceSheet.getNumMergedRegions());

// 合并的

for (i = 0; i < sourceSheet.getNumMergedRegions(); i++) {

region = sourceSheet.getMergedRegionAt(i);

if ((region.getRowFrom() >= pStartRow)

&& (region.getRowTo() <= pEndRow)) {

targetRowFrom = region.getRowFrom() - pStartRow + pPosition;

targetRowTo = region.getRowTo() - pStartRow + pPosition;

region.setRowFrom(targetRowFrom);

region.setRowTo(targetRowTo);

targetSheet.addMergedRegion(region);

}

}

// 置列

for (i = pStartRow; i <= pEndRow; i++) {

sourceRow = sourceSheet.getRow(i);

if (sourceRow != null) {

for (j = sourceRow.getLastCellNum(); j > sourceRow

.getFirstCellNum(); j--) {

targetSheet

.setColumnWidth(j, sourceSheet.getColumnWidth(j));

targetSheet.setColumnHidden(j, false);

}

break;

}

}

// 行并填充数

for (; i <= pEndRow; i++) {

sourceRow = sourceSheet.getRow(i);

if (sourceRow == null) {

continue;

}

targetRow = targetSheet.createRow(i - pStartRow + pPosition);

targetRow.setHeight(sourceRow.getHeight());

for (j = sourceRow.getFirstCellNum(); j < sourceRow

.getPhysicalNumberOfCells(); j++) {

sourceCell = sourceRow.getCell(j);

if (sourceCell == null) {

continue;

}

targetCell = targetRow.createCell(j);

targetCell.setCellStyle(sourceCell.getCellStyle());

cType = sourceCell.getCellType();

targetCell.setCellType(cType);

switch (cType) {

case HSSFCell.CELL_TYPE_BOOLEAN:

targetCell.setCellValue(sourceCell.getBooleanCellValue());

System.out.println("--------TYPE_BOOLEAN:"

+ targetCell.getBooleanCellValue());

break;

case HSSFCell.CELL_TYPE_ERROR:

targetCell

.setCellErrorValue(sourceCell.getErrorCellValue());

System.out.println("--------TYPE_ERROR:"

+ targetCell.getErrorCellValue());

break;

case HSSFCell.CELL_TYPE_FORMULA:

// parseFormula个函数的用途在后面

targetCell.setCellFormula(parseFormula(sourceCell

.getCellFormula()));

System.out.println("--------TYPE_FORMULA:"

+ targetCell.getCellFormula());

break;

case HSSFCell.CELL_TYPE_NUMERIC:

targetCell.setCellValue(sourceCell.getNumericCellValue());

System.out.println("--------TYPE_NUMERIC:"

+ targetCell.getNumericCellValue());

break;

case HSSFCell.CELL_TYPE_STRING:

targetCell

.setCellValue(sourceCell.getRichStringCellValue());

System.out.println("--------TYPE_STRING:" + i

+ targetCell.getRichStringCellValue());

break;

}


/**

* POIExcel公式的支持是相当好的,但是有一个问题,如果公式里面的函数不参数,比如now()today()

* 那么你通getCellFormula()取出来的就是now(ATTR(semiVolatile))today(ATTR(semiVolatile))

* 这样写入Excel是会出的,也是我上面copyRow的函数在写入公式前要parseFormula的原因,

* parseFormula个函数的功能很简单,就是把ATTR(semiVolatile)

* @param pPOIFormula

* @return

*/

private static String parseFormula(String pPOIFormula) {

final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$

StringBuffer result = null;

int index;


result = new StringBuffer();

index = pPOIFormula.indexOf(cstReplaceString);

if (index >= 0) {

result.append(pPOIFormula.substring(0, index));

result.append(pPOIFormula.substring(index

+ cstReplaceString.length()));

} else {

result.append(pPOIFormula);

}
return result.toString();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值