最近在一些项目里,经常要用到excel文件处理,所以就想到了有没有什么办法用程序来代替人的人工查找和录入的工作。这里分享一下用java编写程序,处理excel表格的方法。
Java对excel的处理需要第三方类库,其中用的比较广泛的有jxl和poi,其中jxl只能处理xls后缀名的文件(xls是excel 1997-2003表格文件格式的扩展名),而且已经停止更新和维护。因此不建议读者使用。而poi类库可以处理xls文件和xlsx文件(xlsx是excel 1997-2003表格文件的升级版,Excel软件自2007年起开始使用的文件格式,xls文件已经成为使历史版本)。接下来我们来看看poi的具体使用方法(重点介绍XSSF对xlsx文件的处理方法)。
我们需要先导入一个文件库。笔者这里使用poi-3.7版本来做演示,读者可以根据需要,自行选择,本文给出一个参考的下载地址http://download.csdn.net/download/evangel_z/4107089
下载后,将poi包手动解压,并导入到eclipse的相应工程中去,便可使用。
那话不多说,先上代码:
package program2017_7_12;
import java.io.File;
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.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelTools {
static File createExcel(String pathname){
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("sheet1");
//HSSFComment cell=sheet.getCellComment(2, 2);
int rowcol=16381;
// 以下这两步可以重复操作。
createcell(sheet,rowcol,rowcol);
XSSFCell cell=sheet.getRow(rowcol).getCell(rowcol);
cell.setCellValue("测试字符串");
//System.out.println(cell.toString());
File file = new File(pathname);//Excel文件生成后存储的位置。
try {
FileOutputStream os = new FileOutputStream(file);
wb.write(os);
os.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return file;
}
static void createcell(XSSFSheet sheet,int rowNum,int colNum){
Row row=sheet.createRow( rowNum);
// 在当前行的colNum列上创建单元格
XSSFCell cell = (XSSFCell) row.createCell(colNum);
// 定义单元格为字符类型,也可以指定为日期类型、数字类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 添加内容至单元格
cell.setCellValue("表头名-" + colNum);
}
public static void main(String[] args) {
ExcelTools.createExcel("C:/Users/823811845/Desktop/测试.xlsx");
}
}
接下来我们对这些以上代码做相应的解释,poi类库中有两个大类HSSF和XSSF,其中HSSF是对xls文件的纯Java代码实现,而XSSF对xlsx文件处理的纯Java代码实现。(xls格式最大仅能支持65536行和256列,而xlsx格式可以支持可有1048576行,16384列。如果你要处理的文件行数大于65536行,或者列数大于256列,都推荐你使用xlsx格式,相应的,代码中使用XSSF的类库。)
XSSF的处理表格的思路如下,首先建立XSSFWorkbook,它相当于一个虚拟存在于Java环境中的工作簿。一个XSSFWorkbook对应着一个Excel磁盘文件。然后运行
XSSFSheet sheet = wb.createSheet("sheet1");
在当前XSSFWorkbook下创建一个XSSFSheet,它相当于Excel文件中的一个sheet(表格页)。
关于sheet这里需要说明的是,sheet表格页上的单元格需要另行创建。相应代码: createcell(sheet,rowcol,rowcol);
找到根据行列坐标,找到相应的单元格:
XSSFCell cell=sheet.getRow(rowcol).getCell(rowcol);
最后给单元格赋值:
cell.setCellValue("测试字符串");
随后我们创建一个新的文件,扩展名命名为xlsx格式。并且把XSSFWorkbook中的内容赋值进去:
File file = new File(pathname);//Excel文件生成后存储的位置。
FileOutputStream os = new FileOutputStream(file);
wb.write(os);
os.close();
关于读取文件,我们一般可以使用如下代码:
String str=cell.getStringCellValue();
这里需要注意的是,poi对单元格的格式有严格的定义,如果单元格的存储属性不是string的话,系统就会报错,此时需要调用相应的函数才能获得其中的内容(例如单元格的格式是boolean格式,那么就需要boolean b=cell.getBooleanCellValue();来获取其中的内容),所以,读者在处理单元格格式繁多的文件的时候,可以用swith先判断单元格数据格式,再做处理,例如:
switch(cell.getCellType()){
case Cell.CELL_TYPE_BLANK:
singleRow[column] = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
singleRow[column] = Boolean.toString(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
singleRow[column] = "";
break;
case Cell.CELL_TYPE_FORMULA:
cell.setCellType(Cell.CELL_TYPE_STRING);
singleRow[column] = cell.getStringCellValue();
如果有什么疑问,可以留言,希望能和大家交流。