一脸懵逼学习Java操作Excel之POI(Apache POI)

时间:2023-03-08 20:35:23

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

1:下面简单的程序来创建一个空白Microsoft Excel工作簿。

请记住一定要引入jar包,切记:http://poi.apache.org/download.html

如:poi-3.9-20121203.jar

 package com.bie;

 import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook; /**
*
* @author biexiansheng
*
*/
public class PoiTest { public static void main(String[] args) throws IOException {
//创建一个空的工作簿
Workbook wb = new HSSFWorkbook();
//创建输出流
FileOutputStream fos = new FileOutputStream("c:\\poi.xlsx");
//写入到流中,创建这个excel文件
wb.write(fos);
//关闭流
fos.close(); }
}

2:创建一个excel,然后插入一些数据测试一下;

 package com.bie;

 import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; /**
*
* @author biexiansheng
*
*/
public class PoiTest { public static void main(String[] args) throws IOException {
//创建一个空的工作簿
Workbook wb = new HSSFWorkbook();
//创建sheet页
Sheet sheet1 = wb.createSheet("第一个sheet页");
wb.createSheet("第二个sheet页");
//创建一个行
Row createRow = sheet1.createRow();
//创建一个单元格,第一列
Cell createCell = createRow.createCell();
createCell.setCellValue("编号");
//创建一个单元格,第二列,然后对此单元格进行赋值
createRow.createCell().setCellValue("姓名");
//创建一个单元格,第三列,然后对此单元格进行赋值
createRow.createCell().setCellValue("年龄");
//创建一个单元格,第四列,然后对此单元格进行赋值
createRow.createCell().setCellValue("性别");
//创建一个单元格,第五列,然后对此单元格进行赋值
createRow.createCell().setCellValue("生日"); //创建第二行
Row createRow2 = sheet1.createRow();
//创建单元格,然后对单元格进行赋值
createRow2.createCell().setCellValue("");
createRow2.createCell().setCellValue("张三");
createRow2.createCell().setCellValue("");
createRow2.createCell().setCellValue("男"); //设置时间格式
//创建一个单元格的样式,单元格样式类
CellStyle cellStyle = wb.createCellStyle();
CreationHelper creationHelper = wb.getCreationHelper();
//格式化日期
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
//得到这个单元格,用于赋值和设置单元格的格式
//第一种方法:
Cell createCell2 = createRow2.createCell();
createCell2.setCellValue(new Date());
createCell2.setCellStyle(cellStyle); //第二种方法:
//Cell createCell3 = createRow2.createCell(4);
//createCell3.setCellValue(Calendar.getInstance());
//createCell3.setCellStyle(cellStyle); //创建输出流
FileOutputStream fos = new FileOutputStream("c:\\poi.xlsx");
//写入到流中,创建这个excel文件
wb.write(fos);
//关闭流
fos.close(); }
}

可以看到excel里面的数据内容如下所示:

一脸懵逼学习Java操作Excel之POI(Apache POI)

3:创建一个时间格式的单元格

package com.bie;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; /**
*
* @author biexiansheng
*
*/
public class PoiTest { public static void main(String[] args) throws IOException {
//创建一个空的工作簿
Workbook wb = new HSSFWorkbook();
//创建sheet页
Sheet sheet1 = wb.createSheet("第一个sheet页");
wb.createSheet("第二个sheet页");
//创建一个行
Row createRow = sheet1.createRow();
//创建一个单元格,第一列
Cell createCell = createRow.createCell();
createCell.setCellValue("编号");
//创建一个单元格,第二列,然后对此单元格进行赋值
createRow.createCell().setCellValue("姓名");
//创建一个单元格,第三列,然后对此单元格进行赋值
createRow.createCell().setCellValue("年龄");
//创建一个单元格,第四列,然后对此单元格进行赋值
createRow.createCell().setCellValue("性别");
//创建一个单元格,第五列,然后对此单元格进行赋值
createRow.createCell().setCellValue("生日"); //创建第二行
Row createRow2 = sheet1.createRow();
//创建单元格,然后对单元格进行赋值
createRow2.createCell().setCellValue("");
createRow2.createCell().setCellValue("张三");
createRow2.createCell().setCellValue("");
createRow2.createCell().setCellValue("男"); //设置时间格式
//创建一个单元格的样式,单元格样式类
CellStyle cellStyle = wb.createCellStyle();
CreationHelper creationHelper = wb.getCreationHelper();
//格式化日期
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
//得到这个单元格,用于赋值和设置单元格的格式
Cell createCell2 = createRow2.createCell();
createCell2.setCellValue(new Date());
createCell2.setCellStyle(cellStyle); //创建输出流
FileOutputStream fos = new FileOutputStream("c:\\poi.xlsx");
//写入到流中,创建这个excel文件
wb.write(fos);
//关闭流
fos.close(); }
}

运行效果如下所示:

一脸懵逼学习Java操作Excel之POI(Apache POI)

4:遍历工作簿的行和列并且获取单元格内容

 package com.bie;

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
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.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; /**
*
* @author biexiansheng
*
*/
public class PoiTest2 { public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("c:\\poi.xlsx");
//接受输入流
POIFSFileSystem pfs = new POIFSFileSystem(fis);
//创建一个工作簿
HSSFWorkbook hwb = new HSSFWorkbook(pfs);
//获取第一个sheet页
HSSFSheet sheetAt = hwb.getSheetAt();
if(sheetAt == null){
return ;
} //遍历行里面的单元格内容.
for(int i =; i<=sheetAt.getLastRowNum(); i++){
//得到每一行
HSSFRow row = sheetAt.getRow(i);
//如果为空就跳出
if(row == null){
continue;
}
//遍历列
for(int j=; j<row.getLastCellNum(); j++){
//遍历列里面的内容
HSSFCell cell = row.getCell(j);
if(cell == null){
continue;
}
//输出列里面的内容
System.out.print(" " + cell);
}
System.out.println();
}
} public static String getValue(HSSFCell cell){
if(cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
return String.valueOf(cell.getBooleanCellValue());
}else if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
return String.valueOf(cell.getNumericCellValue());
}else{
return String.valueOf(HSSFCell.CELL_TYPE_STRING);
}
} }

运行效果如下所示:

一脸懵逼学习Java操作Excel之POI(Apache POI)

5:文本提取

 package com.bie;

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date; import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
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.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; /**
*
* @author biexiansheng
*
*/
public class PoiTest3 { public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("c:\\poi.xlsx");
//接受输入流
POIFSFileSystem pfs = new POIFSFileSystem(fis);
//创建一个工作簿
HSSFWorkbook hwb = new HSSFWorkbook(pfs);
//获取第一个sheet页
HSSFSheet sheetAt = hwb.getSheetAt();
if(sheetAt == null){
return ;
}
//文本抽取
ExcelExtractor excelExtractor = new ExcelExtractor(hwb);
System.out.println(excelExtractor.getText());
} }

运行效果如下所示://不要sheet的名称
 excelExtractor.setIncludeSheetNames(false);

一脸懵逼学习Java操作Excel之POI(Apache POI)

6:单元格对齐方式,单元格边框处理,单元格填充色和颜色操作,单元格合并

 package com.bie;

 import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
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.util.CellRangeAddress; /**
* @author Author:别先生
* @date Date:2017年9月9日 上午10:14:31
*
*
*/
public class PoiTest { /***
* 创建一个单元格并为其设定指定的对齐方式
* @param wb 工作簿
* @param row 行
* @param column 列
* @param halign 水平对齐的方式
* @param valign 垂直对齐的方式
*/
private static void createCell(Workbook wb,Row row,short column,short halign,short valign){
//创建单元格
Cell cell = row.createCell(column);
//设置单元格的值
cell.setCellValue(new HSSFRichTextString("测试内容"));
//创建单元格的样式
CellStyle cellStyle = wb.createCellStyle();
//设置单元格水平对齐方式
cellStyle.setAlignment(halign);
//设置单元格垂直对齐方式
cellStyle.setVerticalAlignment(valign); //设置边框线和颜色
//底部边框
cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
//底部颜色
cellStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex()); //左边边框
cellStyle.setBorderLeft(CellStyle.BORDER_DASH_DOT);
//左边颜色
cellStyle.setBottomBorderColor(IndexedColors.RED.getIndex()); //右边边框
cellStyle.setRightBorderColor(CellStyle.ALIGN_FILL);
//右边边框颜色
cellStyle.setBottomBorderColor(IndexedColors.DARK_YELLOW.getIndex()); //顶部边框
cellStyle.setBorderTop(CellStyle.BORDER_DOTTED);
//顶部颜色
cellStyle.setTopBorderColor(IndexedColors.AUTOMATIC.getIndex()); //设置单元格填充色和颜色操作
//设置背景颜色
cellStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex());
cellStyle.setFillPattern(CellStyle.BIG_SPOTS);
//设置前景颜色
cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
cellStyle.setFillPattern(CellStyle.BIG_SPOTS); //设置单元格的样式
cell.setCellStyle(cellStyle);
} public static void main(String[] args) throws IOException {
//定义一个工作簿
Workbook wb =new HSSFWorkbook();
//创建第一个sheet页
Sheet createSheet = wb.createSheet("第一个sheet");
//创建第一行
Row createRow = createSheet.createRow();
createRow.setHeightInPoints(); //调用工具方法,创建单元格
//单元格的对齐方式的调用和使用
createCell(wb, createRow, (short), HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_BOTTOM);;
createCell(wb, createRow, (short), HSSFCellStyle.ALIGN_LEFT, HSSFCellStyle.VERTICAL_CENTER);;
createCell(wb, createRow, (short), HSSFCellStyle.ALIGN_RIGHT, HSSFCellStyle.VERTICAL_TOP);;
createCell(wb, createRow, (short), HSSFCellStyle.ALIGN_JUSTIFY, HSSFCellStyle.VERTICAL_JUSTIFY);; //创建单元格
//创建第3行
Row createRow2 = createSheet.createRow();
createRow.setHeightInPoints();
//创建第一列和第二列
Cell createCell = createRow2.createCell();
createCell.setCellValue("单元格合并1"); Cell createCell2 = createRow2.createCell();
createCell2.setCellValue("单元格合并2"); //单元格合并,起始行,结束行,起始列,结束列
createSheet.addMergedRegion(new CellRangeAddress(, , , )); //创建输出流
FileOutputStream fos = new FileOutputStream("d:\\poi.xlsx");
//将内容写到excel文件中
wb.write(fos);
//关闭流
fos.close();
} }

演示效果如下所示:
一脸懵逼学习Java操作Excel之POI(Apache POI)

7:字体处理的单元格

 package com.bie;

 import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
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.util.CellRangeAddress; /**
* @author Author:别先生
* @date Date:2017年9月9日 上午10:14:31
*
*
*/
public class PoiTest2 { public static void main(String[] args) throws IOException {
//定义一个工作簿
Workbook wb =new HSSFWorkbook();
//创建第一个sheet页
Sheet createSheet = wb.createSheet("第一个sheet");
//创建第一行
Row createRow = createSheet.createRow(); //创建一个字体处理类
Font createFont = wb.createFont();
createFont.setFontHeightInPoints((short));
createFont.setFontName("Courier New");
createFont.setItalic(true);
createFont.setStrikeout(true); CellStyle createCellStyle = wb.createCellStyle();
createCellStyle.setFont(createFont); //创建单元格
Cell createCell = createRow.createCell((short));
createCell.setCellValue("这是一个字体设计的单元格");
createCell.setCellStyle(createCellStyle); //创建输出流
FileOutputStream fos = new FileOutputStream("d:\\poi.xlsx");
//将内容写到excel文件中
wb.write(fos);
//关闭流
fos.close();
} }

演示效果如下所示:
一脸懵逼学习Java操作Excel之POI(Apache POI)

8:读取和重写工作簿

 package com.bie;

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; 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;
import org.apache.poi.ss.usermodel.Workbook; /**
* @author Author:别先生
* @date Date:2017年9月9日 上午10:14:31
*
*
*/
public class PoiTest3 { public static void main(String[] args) throws IOException {
//创建输入流
FileInputStream fis = new FileInputStream("d:\\poi.xlsx");
//将获取到文件流放到内存中
POIFSFileSystem pfs = new POIFSFileSystem(fis);
//创建一个工作簿
Workbook wb = new HSSFWorkbook(pfs);
//获取第一个sheet页
Sheet sheetAt = wb.getSheetAt();
//获取第6行
Row row = sheetAt.getRow();
//获取第六个单元格
Cell cell = row.getCell();
if(cell == null){
cell = row.createCell();
}
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("测试单元格"); //创建输出流
FileOutputStream fos = new FileOutputStream("d:\\poi.xlsx");
//将内容写到excel文件中
wb.write(fos);
//关闭流
fos.close();
fis.close();
} }

演示效果如下所示:

一脸懵逼学习Java操作Excel之POI(Apache POI)

9:poi操作单元格换行操作:

 package com.bie;

 import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
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.util.CellRangeAddress; /**
* @author Author:别先生
* @date Date:2017年9月9日 上午10:14:31
*
*
*/
public class PoiTest4 { public static void main(String[] args) throws IOException {
//定义一个工作簿
Workbook wb =new HSSFWorkbook();
//创建第一个sheet页
Sheet createSheet = wb.createSheet("第一个sheet");
//创建第一行
Row createRow = createSheet.createRow();
//创建单元格
Cell createCell = createRow.createCell();
createCell.setCellValue("我要换行\n are you ok !!!!"); //设置样式
CellStyle cs = wb.createCellStyle();
//设置可以换行
cs.setWrapText(true);
createCell.setCellStyle(cs); //调整一下行的高度
createRow.setHeightInPoints( * createSheet.getDefaultRowHeightInPoints());
//调整单元格的宽度
createSheet.autoSizeColumn(); //创建输出流
FileOutputStream fos = new FileOutputStream("d:\\poi.xlsx");
//将内容写到excel文件中
wb.write(fos);
//关闭流
fos.close();
} }

演示效果如下所示:
一脸懵逼学习Java操作Excel之POI(Apache POI)

10、java集合数据写入至Excel文件poi。

 package com.feixian.yqdata.utils;

 import com.feixian.yqdata.po.YqData;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
*
*/
public class DecryptExcelData2 { public static void main(String[] args) throws IOException { List<YqData> yqData = new ArrayList<>();
YqData yqData1 = new YqData("张三", "", "2020-02-05 12:22:22", "巴铁");
YqData yqData2 = new YqData("张三", "", "2020-02-05 12:22:22", "巴铁");
YqData yqData3 = new YqData("张三", "", "2020-02-05 12:22:22", "巴铁");
YqData yqData4 = new YqData("张三", "", "2020-02-05 12:22:22", "巴铁"); yqData.add(yqData1);
yqData.add(yqData2);
yqData.add(yqData3);
yqData.add(yqData4); //创建一个空的工作簿
Workbook wb = new HSSFWorkbook();
//创建sheet页
Sheet sheet1 = wb.createSheet("sheet0");
//创建一个行
Row createRow = sheet1.createRow();
//创建一个单元格,第一列
Cell createCell = createRow.createCell();
createCell.setCellValue("name");
//创建一个单元格,第二列,然后对此单元格进行赋值
createRow.createCell().setCellValue("CertNo");
//创建一个单元格,第三列,然后对此单元格进行赋值
createRow.createCell().setCellValue("TriplDate");
//创建一个单元格,第四列,然后对此单元格进行赋值
createRow.createCell().setCellValue("TripMode"); //设置时间格式
//创建一个单元格的样式,单元格样式类
// CellStyle cellStyle = wb.createCellStyle();
// CreationHelper creationHelper = wb.getCreationHelper();
// //格式化日期
// cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss")); // 循环遍历生成的集合
for (int i = ; i < yqData.size(); i++) {
Row createRows = sheet1.createRow(i + );
createRows.createCell().setCellValue(yqData.get(i).getName());
createRows.createCell().setCellValue(yqData.get(i).getCertNo()); // 设置日期类型
createRows.createCell().setCellValue(yqData.get(i).getTriplDate());
// 设置日期类型的样式
// createRows.createCell(2).setCellStyle(cellStyle); createRows.createCell().setCellValue(yqData.get(i).getTripMode());
} //创建输出流
FileOutputStream fos = new FileOutputStream("F:\\poi.xlsx");
//写入到流中,创建这个excel文件
wb.write(fos);
//关闭流
fos.close();
} }

效果如下所示:

一脸懵逼学习Java操作Excel之POI(Apache POI)