编译环境:IntelliJ IDEA
poi-ooxml 3.15版本的jar包(下面是jar包地址)
https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml/3.15
第一个问题:如何使用POI创建Excel表格并将内容输入到Excel表格?
//创建工作簿 XSSF代表10版的Excel(HSSF是03版的Excel)
XSSFWorkbook wb = new XSSFWorkbook();
//使用工作簿创建工作表
XSSFSheet sheet = wb.createSheet("此处是sheet表名");
/* 此处包含一系列对表格内容的操作,合并下方第五六问下的代码放入此处即可*/
//上面设置好了内容,我们当然是要输出到某个文件的,输出就需要有输出流
File file = new File("E:/2010.xlsx");
//判断该文件是否存在,若不存在则创建该文件
if(!file.exists()){
file.createNewFile();
}
//创建一个向 file文件中写入数据的文件输出流(输入流输出流是以程序为中心的)
FileOutputStream fos= new FileOutputStream(file);
//向指定文件写入内容
wb.write(fos);
fos.close();
好,上面我们已经创建好了一个Excel表格,并且具备了向该表格输入数据的能力
这就是上面程序创建好的表格(我的Excel还没激活,嘿嘿)
第二个问题:如何向Excel表格中输入内容?
在这里解释一下,虽然这个表格看上去所有的单元格都有,其实对于程序来说是空白的,因为我们只创建了一张空表,所以实际是这样子的
(我用马赛克涂的,嘻嘻)
接下来就是创建行并且创建单元格(所有的行和单元格都是创建后才有的)
下标从0开始,0代表第一行也代表第一列。
//创建第一行
XSSFRow row = sheet.createRow(0);
//在行中创建第一列(就是创建了一个单元格)
XSSFCell cell = row.createCell(0);
//设置该单元格的内容
cell.setCellValue("加油!");
第三个问题,怎么合并单元格? (这跟第二个问题下的代码无关)
// 那我们先创建三行三列
for (int i = 0 ; i < 3 ; i++){
XSSFRow row = sheet.createRow(i);
for(int j = 0 ; j < 3 ; j++){
row.createCell(j);
}
}
//合并第一行第二行第一列,即合并(0,0)和(1,0)两个单元格
//四个参数为(起始行,终止行,起始列,终止列)
sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
//合并第三行第一列第二列第三列,即合并(2,0)和(2,1)、(2,2)三个单元格
sheet.addMergedRegion(new CellRangeAddress(2,2,0,2));
第四个问题:如何给合并行设置数据?
直接给(起始行,起始列)这个坐标的位置赋值就可以啦。
//给第一个合并格赋值
sheet.getRow(0).getCell(0).setCellValue("你好!");
//给第二个合并格赋值
sheet.getRow(2).getCell(0).setCellValue("Hello!");
第五个问题:我想要数据在中间,而不是在边上怎么处理?
那这个就要设置单元格的格式了,这个应该放在创建单元格之前,和第三四问的代码合并起来就是:
//设置单元格风格
XSSFCellStyle style = wb.createCellStyle();
//设置边框
style.setBorderTop(BorderStyle.THIN); //上边框
style.setBorderBottom(BorderStyle.THIN); //下边框
style.setBorderLeft(BorderStyle.THIN); //左边框
style.setBorderRight(BorderStyle.THIN); //右边框
//设置文字水平居中
style.setAlignment(HorizontalAlignment.CENTER);
//设置文字垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
//=======================================================
//=======================================================
//创建三行三列
for (int i = 0 ; i < 3 ; i++){
XSSFRow row = sheet.createRow(i);
for(int j = 0 ; j < 3 ; j++){
row.createCell(j).setCellStyle(style); //为每个单元格设置风格(可用if语句选择设置)
}
}
//合并第一行第二行第一列,即合并(0,0)和(1,0)两个单元格
sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
//合并第三行第一列第二列第三列,即合并(2,0)和(2,1)、(2,2)三个单元格
sheet.addMergedRegion(new CellRangeAddress(2,2,0,2));
//给第一个合并格赋值
sheet.getRow(0).getCell(0).setCellValue("你好!");
//给第二个合并格赋值
sheet.getRow(2).getCell(0).setCellValue("Hello!");
第六个问题:如何设置行高?
现在举个例子,还是上述代码,我要第三行数据的高度增加,不那么窄。
//增加第三行行高,单位是px
sheet.getRow(2).setHeightInPoints(20);
第七个问题:我把第一个的“你好!”改成很长的“你好!加油!”,会发现单元格盛不下数据。
那就要设置宽度了。
//getPhysicalNumberOfCells()代表这行有多少包含数据的列
for(int i=0;i
最后,放几个异常在这里:
说明Excel表格打开了没关,每次运行代码的时候都要把这个Excel表格关掉。
这个说明在合并单元格的时候重复了,比如合并了(1,0)(1,1),
后面又合并(1,1)(1,2)。因为(1,1)已经被合并过一次了,再重复合并就会出错。
这个问题就是还没创建某个单元格就操作它。比如上面我创建了3行,然后我操作
sheet.getRow(3).getCell(0).setCellValue("===");就会报错,因为我只创建了3行,getRow(i)中i的最大值只能是2。
如果有错误欢迎指出~~