HSSF总结
HSSF有什么用
日常工作中,常常对表格类型的数据进行处理,如果自己编写的java程序进行数据处理的时候需要用到表格类数据,而Excel表格在保存表格类数据的时候明显比普通txt文本更有优势。因此,利用适当的API,直接对Excel表格进行处理就显得很有必要。
目前常见读写Excel的工具类开源javaAPI有两种方式:
* 一个是JXL(Java Excel API)
官网地址:http://jexcelapi.sourceforge.net/
* 一个是Apache的POI(Poor Obfuscation Implementation)
官网地址:http://poi.apache.org/
最近做了一个关于表格文件存储的小程序,用的就是POI的HSSF。下面对程序制作中总结出来的操作和注意到的细节进行总结。(本文最后一次修改日期:2017/5/8)
值得注意的Excal的部分特性
版本 | 后缀名 | 行 | 列 | 处理工具 |
---|---|---|---|---|
OLE2 | .xls | 0~65535 | 0~255 | HSSF |
OOXML | .xlsx | 0~1045875 | 0~16383 | XSSF |
导入POI
导入POI其实就是导入Apache的POI的jar包,我在网上找到的POI的jar包总共六个,如下:
具体步骤如下:
* 在想导入POI的工程下建立新文件夹,最好命名为“lib”;
将jar包原件复制粘贴到lib文件夹中(在eclipse下就能操作);
再将这六个文件全选,然后右键单击,选择Build Path,选择导入
- 上边就是所有的步骤了
基础操作
创建
操作 | 表述 | 备注 |
---|---|---|
新建工作簿 | HSSFWorkbook wb = new HSSFWorkbook(); | |
新建表格 | HSSFSheet sheet = wb.createSheet(“mysheet”); | 只能在工作簿存在的情况下新建表格 |
创建行对象 | HSSFRow row = sheet.createRow(1); | 只能在工作表存在的情况下新建行对象 |
创建单元格对象 | HSSFCell cell = row.createCell((short)(pos)); | 在row行的第pos列上创建单元格 |
创建新Excal文件 | 第一种:利用File文件类的方法创建 第二种:利用HSSF的write()方法创建 | 推荐使用第二种 |
打开
打开工作簿
打开确定存在的工作簿,总共分三步 | |||
---|---|---|---|
创建输入流InputStream | FileInputStream in = new FileInputStream(File file); | ||
利用已创建的输入流创建HSSF的解析工具并解析 | POIFSFileSystem fs = new POIFSFileSystem(in); | ||
利用创建好的解析工具打开目标文件 | HSSFWorkbook wb = new HSSFWorkbook(fs); |
* 在我实际编程中,如果想实现“文件存在则打开,文件不存在则创建”的效果,一定要先加判断语句,属于打开文件的代码块中写这三条指令。不然会报错,抛出IOException异常。
示例代码如下:
*
import java.io.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public class FoeNodes {
public static void main(String[] args) {
File file = new File("d:\\java\\");
HSSFWorkbook book = null;
FileInputStream in = null;
FileOutputStream out = null;
try {
if (file.exists()) {
in = new FileInputStream(file);
POIFSFileSystem fs = new POIFSFileSystem(in);
book = new HSSFWorkbook(fs);
in.close();
} else {
// 创建文件夹
if (file.getParentFile().exists() == false) {
file.getParentFile().mkdirs();
}
book = new HSSFWorkbook();
book.write(out);
out.close();
}
}catch(IOException ee) {
ee.getMessage();
}
}
}
打开其它对象
操作 | 表述 | 备注 |
---|---|---|
选择第一个工作表 | HSSFSheet sheet = wb.getSheetAt(0); | |
选择制定名称的工作表 | HSSFSheet sheet = book.getSheet(String name); | |
选择当前sheet的第一行 | HSSFRow row = sheet.getRow(0); | |
选择row的第一列元素 | HSSFCell cell = row.getCell(0); |
设置单元格
操作 | 表述 | 备注 |
---|---|---|
设置工作表的名称 | book.setSheetName(0, “First”); | |
设置单元格的值 | cell.setCellValue(DATA); | DATA的类型可以为 int/Date/Calendar/double/String(过时的)/HSSFRichTextString 等 |
设置单元格风格 | cell.setCellStyle(new HSSFCellStyle()); | |
设置打印方向 | sheet.getPrintSetup().setLandscape(true); | 设置为横向打印(默认纵向) |
设置行高 | row.setHeightInPoints(18); | |
设置指定列列宽 | sheet.setColumnWidth((short)colNo, (short)(length)); | |
设置默认列宽 | sheet.setDefaultColumnWidth((short) 10); | |
特定区域设为每页都打印 | book.setRepeatingRowsAndColumn(sheetn,scol,ecol,srow,erow); | |
合并单元格 | region = new Region(curr-1, (short)(1), curow-1+3, (short)1);(已过时) sheet.addMergedRegion(new CellRangeAddress(srow, erow, scol, ecol)); |
设置单元格样式示例
private HSSFCellStyle leftStyle(HSSFWorkbook wb){
HSSFCellStyle curStyle = wb.createCellStyle();
HSSFFont curFont = wb.createFont(); //设置字体
//curFont.setFontName("Times New Roman"); //设置英文字体
curFont.setFontName("微软雅黑"); //设置英文字体
curFont.setCharSet(HSSFFont.DEFAULT_CHARSET); //设置中文字体,那必须还要再对单元格进行编码设置
curFont.setFontHeightInPoints((short)10); //字体大小
curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗
curStyle.setFont(curFont);
curStyle.setBorderTop(HSSFCellStyle.BORDER_THICK); //粗实线
curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //实线
curStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM); //比较粗实线
curStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); //实线
curStyle.setWrapText(true); //换行
curStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT); //横向具右对齐
curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //单元格垂直居中
return curStyle;
}