刚过年来,公司事情不多,就想着学习一点东西,所以就看上了利用java操作Excel,具体网上搜了一下,一共有两种方法,分别是jxl和poi。两个性能貌似差不多,我就找poi学习了一下。
poi操作Excel的方法还是很多的,经过我的学习,发现其实可以分为几部分,workbook---sheet---row---cel,这几层级关系
我具体写了两个工具类,还写的不够,估计也会有一定的问题。先放上来,有大神看到错误请指点。
package cn.com.liuhl.sendEmailByExcel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Sheet;
/**
*
* <p>
* 操作工作簿
* </p>
*
* @author liuhl
* @version
*/
public class MyWorkBookUtil {
private static File file;
private static HSSFWorkbook workbook;
static {
try {
file = new File("C:\\Users\\liuhl\\Desktop\\ceshi.xls");
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
workbook = new HSSFWorkbook(fs);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取工作簿对象
*
* @return
*/
public static HSSFWorkbook getWorkBook() {
return workbook;
}
/**
*
* 获取工作表
*
* @param sheetName
* @return
*/
public static Sheet getSheet(String sheetName) {
HSSFSheet sheet = workbook.getSheet(sheetName);
return sheet;
}
/**
* 创建一个sheet
*
* @param sheetname
*/
public static void creatSheet(String sheetname) {
// 如果输入sheet名为空,就默认创建一个sheet
if ("".equals(sheetname)) {
workbook.createSheet();
} else {
workbook.createSheet(sheetname);
}
try {
fileWrite();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据索引删除sheet
*
* @param index
* 索引,从0开始
*/
public static void removeSheet(int index) {
workbook.removeSheetAt(index);
try {
fileWrite();
close(workbook);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据名字删除sheet
*
* @param name
* 工作表名称
*/
public static void removeSheet(String name) {
int sheetIndex = workbook.getSheetIndex(name);
removeSheet(sheetIndex);
}
/**
* 写/删除后的Excel文件
*
* @param targetFile
* 目标文件
* @param wb
* Excel对象
* @throws Exception
*/
public static void fileWrite() throws Exception {
FileOutputStream fileOut = new FileOutputStream(file);
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
}
/**
* 关闭资源
*
* @param workBook
*/
public static void close(HSSFWorkbook workBook) {
try {
if (workBook != null) {
workBook.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws FileNotFoundException, IOException {
// OperateExcelUtil.creatSheet("sheet4");
MyWorkBookUtil.removeSheet("sheet4");
}
}
package cn.com.liuhl.sendEmailByExcel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
/**
*
* <p>
* sheet操作
* </p>
*
* @author liuhl
* @version
*/
public class MySheetUtil {
private static File file;
private static HSSFWorkbook workbook;
static {
try {
file = new File("C:\\Users\\liuhl\\Desktop\\ceshi.xls");
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
workbook = new HSSFWorkbook(fs);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* 获取工作表
*
* @param sheetName
* @return
*/
public static HSSFSheet getSheet(String sheetName) {
HSSFSheet sheet = workbook.getSheet(sheetName);
return sheet;
}
/**
* 获得sheet工作表中的所有数据,并放入一个二维数组中 需要这个sheet表中全部都是string
*
* @param sheet
* @return
*/
public static Object[][] printAllCell(Sheet sheet) {
// 获得行数
int rows = sheet.getLastRowNum() + 1;
// 获得列数,先获得一行,在得到该行列数
Row tmp = sheet.getRow(0);
if (tmp == null) {
return null;
}
// 建造一个二维数组,用来存储单元格中的元素
Object[][] cells = new Object[rows][];
// 读取数据
for (int row = 0; row < rows; row++) {
Row r = sheet.getRow(row);
// 获得开始单元格和结束单元格的索引
short maxColIx = r.getLastCellNum();
cells[row] = new Object[maxColIx];
// 进入循环
for (short col = 0; col < maxColIx; col++) {
Cell currentCell = r.getCell(col);
if (currentCell == null) {
cells[row][col] = "";
continue;
}
cells[row][col] = currentCell.getStringCellValue();
}
}
return cells;
}
/**
* 修改/创建单元格的值
*
* @param value
*/
public static void setCellValueString(Sheet sheet, int row, int col, String value) {
// 获取行,如果行不存在,就创建
Row currrow = sheet.getRow(row);
if (currrow == null) {
currrow = createRow(sheet, row);
}
// 获取单元格,如果单元格不存在,就创建并赋值
Cell cell = currrow.getCell(col);
if (cell == null) {
currrow.createCell(col).setCellValue(value);
}
try {
FileOutputStream fileOut = new FileOutputStream(file);
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 插入一行,
*
* @param sheet
* @param rows
* 从哪一行插入
*/
public static Row createRow(Sheet sheet, int rows) {
// 获得行数
// 获得列数,先获得一行,在得到该行列数
if (sheet.getRow(rows) != null) {
int lastRows = sheet.getLastRowNum();
sheet.shiftRows(rows, lastRows, 1);
}
Row row = sheet.createRow(rows);
fileWrite();
return row;
}
/**
* 写/删除后的Excel文件
*
* @param targetFile
* 目标文件
* @param wb
* Excel对象
* @throws Exception
*/
public static void fileWrite() {
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream(file);
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
createRow(getSheet("sheet211"), 24);
// setCellValueString(getSheet("sheet211"), 29, 3, "我爱你");
// Object[][] objects = printAllCell(getSheet("sheet211"));
// for (int row = 0; row < objects.length; row++) {
// Object[] r = objects[row];
// for (int col = 0; col < r.length; col++) {
// System.out.print(r[col].toString() + " ");
// }
// System.out.println();
// }
}
}
发现学习一个新的api的最好办法,就是将它写成一个工具类,可以不包含所有的方法和操作,但是一些基础和常用的可以封装一下,这样对api就会更加熟悉。