Java——poi操作Excel
应用的poi.jar包版本为:3.16
1、读取xlsx
(1)、写读Excel类
package poi;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel2 {
// 读取xlsx的数据
public static String readDataExcelx(String filePath) throws IOException{
StringBuilder str = new StringBuilder();
FileInputStream input = null;
try {
// 打开filePath这个路径下指定的文件
input = new FileInputStream(filePath);
XSSFWorkbook workbook = new XSSFWorkbook(input);
// 获取第一个sheet
XSSFSheet sheet0 = workbook.getSheetAt(0);
// 迭代行
for (Iterator<Row> rowIterator = sheet0.iterator(); rowIterator.hasNext();) {
XSSFRow row = (XSSFRow) rowIterator.next();
// 迭代一行中所有的列
for (Iterator<Cell> iterator = row.cellIterator(); iterator.hasNext();) {
XSSFCell cell = (XSSFCell) iterator.next();
// 根据单元的的类型 读取相应的结果
if (cell.getCellTypeEnum() == CellType.STRING)
str.append(cell.getStringCellValue() + "\t");
else if (cell.getCellTypeEnum() == CellType.NUMERIC)
str.append(cell.getNumericCellValue() + "\t");
else if (cell.getCellTypeEnum() == CellType.FORMULA)
str.append(cell.getCellFormula() + "\t");
}
// 换行
str.append("\n");
}
} catch (Exception e) {
// 上抛异常
throw new IOException(e);
} finally {
if(input!=null){
try {
// 关闭输入流
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 返回数据的字符串
return str.toString();
}
// 测试读入的数据
public static void main(String[] args) {
String str;
try {
str = readDataExcelx("d:\\测试.xlsx");
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)、显示效果
2、写入Xlsx
创建一个WriteExcel类,书写以下几个方法
package poi;
public class WriteExcel {
// 设置边框方法
public static void setBorder(){}
// 设置字体方法
public static void getFont(){}
// 设置下拉框方法
public static XSSFSheet setXSSFDropdown(){}
// 创建Excel方法
public static void createXlsx(){}
// 测试main方法
public static void main(String[] args) {}
}
因为写入内容过多,所以将写入拆分成几块
(1)、设置边框方法
/**
* ---------------------设置边框---------------------------
* @param cellStyle 表格类型对象
* @param topBorder 设置上边框
* @param bottomBorder 设置下边框
* @param leftBorder 设置左边框
* @param rightBorder 设置右边框
* @param borderStyle 设置边框类型
*/
public static void setBorder(CellStyle cellStyle, boolean topBorder, boolean bottomBorder, boolean leftBorder,
boolean rightBorder, BorderStyle borderStyle) {
// 如果borderStyle为空,则设置为无样式
if(borderStyle==null){
borderStyle=BorderStyle.NONE;
}
if (topBorder) {
cellStyle.setBorderTop(borderStyle);
}
if (bottomBorder) {
cellStyle.setBorderBottom(borderStyle);
}
if (leftBorder) {
cellStyle.setBorderLeft(borderStyle);
}
if (rightBorder) {
cellStyle.setBorderRight(borderStyle);
}
}
(2)、设置字体方法
/**
* -----------------获得字体以及配置字体类型---------------------
* @param workbook Excel对象
* @param fontName 字体名
* @param fontSize 字体大小
* @param fontColor 字体颜色
* @param bold 加粗
* @param italic 倾斜
* @param Underline 下划线
* @return 返回字体
*/
public static XSSFFont getFont(XSSFWorkbook workbook, String fontName, int fontSize, int[] fontColor, boolean bold,
boolean italic,int Underline) {
// 创建字体对象
if (workbook == null) {
throw new RuntimeException("workbook值为空");
}
XSSFFont font = workbook.createFont();
// 设置字体名字
if (fontName != null) {
font.setFontName(fontName);
}
// 设置字体颜色
if (fontColor != null) {
XSSFColor color = new XSSFColor();
color.setRGB(new byte[] { (byte) fontColor[0], (byte) fontColor[1], (byte) fontColor[2] });
font.setColor(color);
}
// 设置字体大小
if (fontSize > 0) {
font.setFontHeightInPoints((short) fontSize);
}
// 设置字体加粗
font.setBold(bold);
// 设置字体倾斜
font.setItalic(italic);
// 设置字体下划线
font.setUnderline((byte)Underline);
// 返回字体
return font;
}
(3)、设置下拉框方法
/**
* -----------------设置下拉框---------------------------
* @param sheetlist 要设置的sheet.
* @param textlist 下拉框显示的内容
* @param firstRow 开始行
* @param endRow 结束行
* @param firstCol 开始列
* @param endCol 结束列
* @return 设置好的sheet.
*/
public static XSSFSheet setXSSFDropdown(XSSFSheet sheetlist, String[] textlist, int firstRow, int endRow,
int firstCol, int endCol) {
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
// 数据有效性对象
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheetlist);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(textlist);
XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
sheetlist.addValidationData(validation);
return sheetlist;
}
(4)、生成表格的主方法
/**
*
* @param filepath 要创建的xlsx文件目录
* @param list Object[]数据列表
*/
public static void createXlsx(String filepath, List<Object[]> list) throws IOException {
// -------------------创建Excel---------------------
// Excel对象
XSSFWorkbook workbook = new XSSFWorkbook();
// 创建一个sheet0
XSSFSheet sheet0 = workbook.createSheet("产品清单");
// -------------------配置表格类型---------------------
// 创建表格类型对象
CellStyle cellStyle=workbook.createCellStyle();
/*
* CellStyle.BORDER_DOUBLE 双边线
* CellStyle.BORDER_THIN 细边线
* CellStyle.BORDER_MEDIUM 中等边线
* CellStyle.BORDER_DASHED 虚线边线
* CellStyle.BORDER_HAIR 小圆点虚线边线
* CellStyle.BORDER_THICK 粗边线
*/
// 调用方法setBorder设置表格类型的底边框
setBorder(cellStyle,true, true, true, true, BorderStyle.DASHED);
// 调用方法getFont获得字体对象getFont
// ("workbook对象","字体","字体大小","颜色数组(255,255,255),"加粗","倾斜","下划线(0为没下划线)")
XSSFFont font = getFont(workbook, "微软雅黑", 10, new int[] { 255, 0, 0 }, false, false, 0);
// 将字体加入到表格类型中
cellStyle.setFont(font);
// 设置内容居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// -------------------创建表头---------------------
// 设置表头要显示的内容
String[] title = { "编号", "产品名称", "产品价格", "产品数量", "生产日期" };
// 创建第一行(第一行为标号为0)
XSSFRow row0 = sheet0.createRow((short) 0);
// 循环创建第一行表格(第一列标号为0,i=开始的列,title.length-1=结束的列)
for (int i = 0; i <= title.length - 1; i++) {
// 创建表格对象
XSSFCell cell = row0.createCell(i);
// 设置表格类型
cell.setCellStyle(cellStyle);
// 设置表格对象值
cell.setCellValue(title[i]);
// 想合并最后的单元格,则判到最后列后合并单元格
if (i == title.length - 1) {
// 创建表格对象
row0.createCell(i + 1).setCellStyle(cellStyle);
// 合并单元格CellRangeAddress(开始行,结束行, 开始列, 结束列)
row0.getSheet().addMergedRegion(new CellRangeAddress(0, 0, i, i + 1));
}
}
// -------------------创建内容--------------------
//设置下拉选项的菜单
String[] dropdownList = { "产品1号", "产品2号", "产品3号" ,"产品4号" };
// 循环生成行N行
for (int rownum = 1; rownum <= list.size() - 1; rownum++) {
// 创建行对象
XSSFRow row = sheet0.createRow((short) rownum);
// 循环生成行表格
for (int colnum = 0; colnum <= list.get(rownum).length - 1; colnum++) {
// 创建表格对象
XSSFCell cells = row.createCell(colnum);
// 设置表格类型
cells.setCellStyle(cellStyle);
// 从集合中提取数据
cells.setCellValue((String) list.get(rownum - 1)[colnum]);
// 判断是否是第二列,是则加入下拉列表
if (colnum == 1) {
//调用方法setXSSFDropdown创建下拉列表
setXSSFDropdown(sheet0, dropdownList, rownum, rownum, colnum, colnum);
}
// 想合并最后的单元格,则判到最后列后合并单元格
if (colnum == title.length - 1) {
// 创建表格对象
row.createCell(colnum + 1).setCellStyle(cellStyle);
// 合并单元格CellRangeAddress(开始行,结束行, 开始列, 结束列)
row.getSheet().addMergedRegion(new CellRangeAddress(rownum, rownum, colnum, colnum + 1));
}
}
}
// 创建输出流
FileOutputStream out = new FileOutputStream(filepath);
BufferedOutputStream bos = new BufferedOutputStream(out);
// 写入文件到缓冲流中输出
workbook.write(bos);
bos.close();
}
(4)、测试的main方法
// 测试
public static void main(String[] args) {
try {
// 创建测试用的数据
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[] { "001", "产品1号", "1000.0", "20", "2017-07-11" });
list.add(new Object[] { "002", "产品2号", "1200.0", "55", "2017-07-12" });
list.add(new Object[] { "003", "产品3号", "1350.0", "42", "2017-07-13" });
list.add(new Object[] { "004", "产品4号", "1400.0", "99", "2017-07-14" });
// 设置保存目录
String filepath="d://test.xlsx";
// 调用法法
createXlsx(filepath, list);
} catch (Exception e) {
e.printStackTrace();
}
}
(5)、显示效果
3、修改Xlsx
(1)、修改生成的test.xlsx文件
往其中插入一行
package poi;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ModifyExcel {
public static void Modify(String filepath) throws IOException {
FileInputStream input = null;
FileOutputStream out = null;
try {
// ------读取Excel到Java中-------
input = new FileInputStream(filepath);
XSSFWorkbook workbook = new XSSFWorkbook(input);
// ------获得Excel中第1个表-------
XSSFSheet sheet = workbook.getSheetAt(0);
// ------把已有的行往下移动--------
// 设置要移动的是第几行
int n = 2;
// sheet.getLastRowNum()为获取最后一行
// shiftRows(开始行,结束行,移动多少行,是否保留行高,重新设置行高);
for (int i = sheet.getLastRowNum(); i >= n; i--) {
sheet.shiftRows(i, i, 1, true, false);
}
// ------插入行--------
// 设置要插入的数据
String[] data = new String[] { "001", "产品1号", "1000.0", "20", "2017-07-11" };
// 在第N行插入一行
XSSFRow row = sheet.createRow(n);
// 循环创建表格
for (int i = 0; i <= data.length - 1; i++) {
XSSFCell cell=row.createCell(i);
// 如果是最后的单元格,则判到最后列后合并单元格
if (i == data.length - 1) {
// 创建表格对象
row.createCell(i);
// 合并单元格CellRangeAddress(开始行,结束行, 开始列, 结束列)
row.getSheet().addMergedRegion(new CellRangeAddress(n, n, i, i + 1));
}
cell.setCellValue(data[i]);
}
// ------创建输出流--------
out = new FileOutputStream(filepath);
BufferedOutputStream bos = new BufferedOutputStream(out);
// ------写入到流--------
workbook.write(bos);
} catch (IOException e) {
throw new IOException(e);
} finally {
// ------关闭流--------
if(input!=null){
input.close();
}
if(out!=null){
out.close();
}
}
}
public static void main(String[] args){
try {
Modify("d:\\test.xlsx");
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)、显示效果