设为首页 收藏本站
查看: 666|回复: 0

[经验分享] 操作Excel工具类(基于Apache的POI类库)

[复制链接]
YunVN网友  发表于 2017-1-10 11:35:13 |阅读模式
  上一篇介绍的是基于jxl.jar的操作Excel工具类,但是jxl.jar的licence限制了它不能用于商业项目,所以本篇介绍Apache的POI类库。
  上篇文章在这里
  操作Excel工具类(基于jxl.jar)
功能简介:
  1、向Excel文档插入数据,可以是多行可以是多列,保留原单元格格式不变
  2、向Excel文档插入一个新行,并且使用与上一行完全相同的格式
  3、等等
需要的第三方JAR包:
  poi-3.8-20120326.jar
  poi-examples-3.8-20120326.jar
  poi-excelant-3.8-20120326.jar
  poi-ooxml-3.8-20120326.jar
  poi-ooxml-schemas-3.8-20120326.jar
  poi-scratchpad-3.8-20120326.jar
  stax-api-1.0.1.jar
完整的工具类的代码如下:

  感谢gegewuqin9和在世界的中心呼喚愛在回复中建议,对读取单元格值的地方做了修改。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
/**
* Excel工具类
*
* <pre>
* 基于Apache的POI类库
* </pre>
*
* @author 陈峰
*/
public class POIExcelMakerUtil {
private File excelFile;
private InputStream fileInStream;
private Workbook workBook;
public POIExcelMakerUtil(File file) throws Exception {
this.excelFile = file;
this.fileInStream = new FileInputStream(this.excelFile);
this.workBook = WorkbookFactory.create(this.fileInStream);
}
/**
* 写入一组值
*
* @param sheetNum
*            写入的sheet的编号
* @param fillRow
*            是写入行还是写入列
* @param startRowNum
*            开始行号
* @param startColumnNum
*            开始列号
* @param contents
*            写入的内容数组
* @throws Exception
*/
public void writeArrayToExcel(int sheetNum, boolean fillRow,
int startRowNum, int startColumnNum, Object[] contents)
throws Exception {
Sheet sheet = this.workBook.getSheetAt(sheetNum);
writeArrayToExcel(sheet, fillRow, startRowNum, startColumnNum, contents);
}
/**
* 写入一组值
*
* @param sheetNum
*            写入的sheet的名称
* @param fillRow
*            是写入行还是写入列
* @param startRowNum
*            开始行号
* @param startColumnNum
*            开始列号
* @param contents
*            写入的内容数组
* @throws Exception
*/
public void writeArrayToExcel(String sheetName, boolean fillRow,
int startRowNum, int startColumnNum, Object[] contents)
throws Exception {
Sheet sheet = this.workBook.getSheet(sheetName);
writeArrayToExcel(sheet, fillRow, startRowNum, startColumnNum, contents);
}
private void writeArrayToExcel(Sheet sheet, boolean fillRow,
int startRowNum, int startColumnNum, Object[] contents)
throws Exception {
for (int i = 0, length = contents.length; i < length; i++) {
int rowNum;
int columnNum;
// 以行为单位写入
if (fillRow) {
rowNum = startRowNum;
columnNum = startColumnNum + i;
}
//  以列为单位写入
else {
rowNum = startRowNum + i;
columnNum = startColumnNum;
}
this.writeToCell(sheet, rowNum, columnNum,
convertString(contents));
}
}
/**
* 向一个单元格写入值
*
* @param sheetNum
*            sheet的编号
* @param rowNum
*            行号
* @param columnNum
*            列号
* @param value
*            写入的值
* @throws Exception
*/
public void writeToExcel(int sheetNum, int rowNum, int columnNum,
Object value) throws Exception {
Sheet sheet = this.workBook.getSheetAt(sheetNum);
this.writeToCell(sheet, rowNum, columnNum, value);
}
/**
* 向一个单元格写入值
*
* @param sheetName
*            sheet的名称
* @param columnRowNum
*            单元格的位置
* @param value
*            写入的值
* @throws Exception
*/
public void writeToExcel(String sheetName, int rowNum, int columnNum,
Object value) throws Exception {
Sheet sheet = this.workBook.getSheet(sheetName);
this.writeToCell(sheet, rowNum, columnNum, value);
}
/**
* 向一个单元格写入值
*
* @param sheetNum
*            sheet的编号
* @param columnRowNum
*            单元格的位置
* @param value
*            写入的值
* @throws Exception
*/
public void writeToExcel(int sheetNum, String columnRowNum, Object value)
throws Exception {
Sheet sheet = this.workBook.getSheetAt(sheetNum);
this.writeToCell(sheet, columnRowNum, value);
}
/**
* 向一个单元格写入值
*
* @param sheetNum
*            sheet的名称
* @param columnRowNum
*            单元格的位置
* @param value
*            写入的值
* @throws Exception
*/
public void writeToExcel(String sheetName, String columnRowNum, Object value)
throws Exception {
Sheet sheet = this.workBook.getSheet(sheetName);
this.writeToCell(sheet, columnRowNum, value);
}
private void writeToCell(Sheet sheet, String columnRowNum, Object value)
throws Exception {
int[] rowNumColumnNum = convertToRowNumColumnNum(columnRowNum);
int rowNum = rowNumColumnNum[0];
int columnNum = rowNumColumnNum[1];
this.writeToCell(sheet, rowNum, columnNum, value);
}
/**
* 将单元格的行列位置转换为行号和列号
*
* @param columnRowNum
*            行列位置
* @return 长度为2的数组,第1位为行号,第2位为列号
*/
private static int[] convertToRowNumColumnNum(String columnRowNum) {
columnRowNum = columnRowNum.toUpperCase();
char[] chars = columnRowNum.toCharArray();
int rowNum = 0;
int columnNum = 0;
for (char c : chars) {
if ((c >= 'A' && c <= 'Z')) {
columnNum = columnNum * 26 + ((int) c - 64);
} else {
rowNum = rowNum * 10 + new Integer(c + "");
}
}
return new int[] { rowNum - 1, columnNum - 1 };
}
private void writeToCell(Sheet sheet, int rowNum, int columnNum,
Object value) throws Exception {
Row row = sheet.getRow(rowNum);
Cell cell = row.getCell(columnNum);
if (cell == null) {
cell = row.createCell(columnNum);
}
cell.setCellValue(convertString(value));
}
/**
* 读取一个单元格的值
*
* @param sheetName
*            sheet的名称
* @param columnRowNum
*            单元格的位置
* @return
* @throws Exception
*/
public Object readCellValue(String sheetName, String columnRowNum)
throws Exception {
Sheet sheet = this.workBook.getSheet(sheetName);
int[] rowNumColumnNum = convertToRowNumColumnNum(columnRowNum);
int rowNum = rowNumColumnNum[0];
int columnNum = rowNumColumnNum[1];
Row row = sheet.getRow(rowNum);
if (row != null) {
Cell cell = row.getCell(columnNum);
if (cell != null) {
return getCellValue(cell);
}
}
return null;
}
/**
* 获取单元格中的值
*
* @param cell 单元格
* @return
*/
private static Object getCellValue(Cell cell) {
int type = cell.getCellType();
switch (type) {
case Cell.CELL_TYPE_STRING:
return (Object) cell.getStringCellValue();
case Cell.CELL_TYPE_NUMERIC:
Double value = cell.getNumericCellValue();
return (Object) (value.intValue());
case Cell.CELL_TYPE_BOOLEAN:
return (Object) cell.getBooleanCellValue();
case Cell.CELL_TYPE_FORMULA:
return (Object) cell.getArrayFormulaRange().formatAsString();
case Cell.CELL_TYPE_BLANK:
return (Object) "";
default:
return null;
}
}
/**
* 插入一行并参照与上一行相同的格式
*
* @param sheetNum
*            sheet的编号
* @param rowNum
*            插入行的位置
* @throws Exception
*/
public void insertRowWithFormat(int sheetNum, int rowNum) throws Exception {
Sheet sheet = this.workBook.getSheetAt(sheetNum);
insertRowWithFormat(sheet, rowNum);
}
/**
* 插入一行并参照与上一行相同的格式
*
* @param sheetName
*            sheet的名称
* @param rowNum
*            插入行的位置
* @throws Exception
*/
public void insertRowWithFormat(String sheetName, int rowNum)
throws Exception {
Sheet sheet = this.workBook.getSheet(sheetName);
insertRowWithFormat(sheet, rowNum);
}
private void insertRowWithFormat(Sheet sheet, int rowNum) throws Exception {
sheet.shiftRows(rowNum, rowNum + 1, 1);
Row newRow = sheet.createRow(rowNum);
Row oldRow = sheet.getRow(rowNum - 1);
for (int i = oldRow.getFirstCellNum(); i < oldRow.getLastCellNum(); i++) {
Cell oldCell = oldRow.getCell(i);
if (oldCell != null) {
CellStyle cellStyle = oldCell.getCellStyle();
newRow.createCell(i).setCellStyle(cellStyle);
}
}
}
/**
* 重命名一个sheet
*
* @param sheetNum
*            sheet的编号
* @param newName
*            新的名称
*/
public void renameSheet(int sheetNum, String newName) {
this.workBook.setSheetName(sheetNum, newName);
}
/**
* 重命名一个sheet
*
* @param oldName
*            旧的名称
* @param newName
*            新的名称
*/
public void renameSheet(String oldName, String newName) {
int sheetNum = this.workBook.getSheetIndex(oldName);
this.renameSheet(sheetNum, newName);
}
/**
* 删除一个sheet
*
* @param sheetName
*            sheet的名称
*/
public void removeSheet(String sheetName) {
this.workBook.removeSheetAt(this.workBook.getSheetIndex(sheetName));
}
/**
* 写入Excel文件并关闭
*/
public void writeAndClose() {
if (this.workBook != null) {
try {
FileOutputStream fileOutStream = new FileOutputStream(
this.excelFile);
this.workBook.write(fileOutStream);
if (fileOutStream != null) {
fileOutStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (this.fileInStream != null) {
try {
this.fileInStream.close();
} catch (Exception e) {
}
}
}
private static String convertString(Object value) {
if (value == null) {
return "";
} else {
return value.toString();
}
}
}
  


 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326539-1-1.html 上篇帖子: google的guava工具类splitter和apache stringutil对比 下篇帖子: 用syslog实现apache远程日志服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表