前言
关于POI的基础的学习只有七节,为了方便大家的观看,在这里整理了一个目录,因为每一节都是层层递进的,所以如果有想看的小伙伴,推荐从第一节开始看。
学习进程
创建一个时间格式的单元格
沿用前面学习的内容,现在在一个单元格塞一个时间格式的数据
代码:
package poi_2;
import java.io.FileOutputStream;
import java.util.Date;
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;
public class Demo1 {
public static void main(String[] args) throws Exception {
Workbook wb=new HSSFWorkbook();//创建一个新的工作簿
Sheet sheet=wb.createSheet("第一个sheet页");//在这个工工作簿创建一个sheet页
Row row=sheet.createRow(0);//创建第一行
Cell cell=row.createCell(0);//创建第一列
cell.setCellValue(new Date());//给单元格设置值
FileOutputStream fileOut=new FileOutputStream("D:\\Cell.xls");
wb.write(fileOut);
fileOut.close();
}
}
效果
改变单元格中的时间的样式
代码:
package poi_2;
import java.io.FileOutputStream;
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;
public class Demo1 {
public static void main(String[] args) throws Exception {
Workbook wb=new HSSFWorkbook();//创建一个新的工作簿
Sheet sheet=wb.createSheet("第一个sheet页");//在这个工工作簿创建一个sheet页
Row row=sheet.createRow(0);//创建第一行
Cell cell=row.createCell(0);//创建第一列
cell.setCellValue(new Date());//给单元格设置值
CreationHelper creationHelper=wb.getCreationHelper();
CellStyle cellStyle=wb.createCellStyle();//设置单元格的样式
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-mm-dd hh:mm:ss"));//设置塞进的日期的类型
cell=row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);//给这个单元格设置样式
FileOutputStream fileOut=new FileOutputStream("D:\\Cell.xls");
wb.write(fileOut);
fileOut.close();
}
}
效果
时间格式的输出的延展:
代码:
package poi_2;
import java.io.FileOutputStream;
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;
public class Demo1 {
public static void main(String[] args) throws Exception {
Workbook wb=new HSSFWorkbook();//创建一个新的工作簿
Sheet sheet=wb.createSheet("第一个sheet页");//在这个工工作簿创建一个sheet页
Row row=sheet.createRow(0);//创建第一行
Cell cell=row.createCell(0);//创建第一列
cell.setCellValue(new Date());//给单元格设置值
CreationHelper creationHelper=wb.getCreationHelper();
CellStyle cellStyle=wb.createCellStyle();//设置单元格的样式
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyy-mm-dd hh:mm:ss"));//设置塞进的日期的类型
cell=row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);//给这个单元格设置样式
//第二种时间格式的输入
cell=row.createCell(2);
cell.setCellValue(Calendar.getInstance());
cell.setCellStyle(cellStyle);
FileOutputStream fileOut=new FileOutputStream("D:\\Cell.xls");
wb.write(fileOut);
fileOut.close();
}
}
效果:
处理不同内容格式的单元格
代码:
package poi_2;
import java.io.FileOutputStream;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFCell;
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;
public class Demo2 {
public static void main(String[] args) throws Exception {
Workbook wb=new HSSFWorkbook();//创建一个新的工作簿
Sheet sheet=wb.createSheet("第一个sheet页");//在这个工工作簿创建一个sheet页
Row row=sheet.createRow(0);//创建第一行
Cell cell=row.createCell(0);//创建第一列
cell.setCellValue(new Date());//给单元格设置值
row.createCell(1).setCellValue(1);
row.createCell(2).setCellValue("字符串");
row.createCell(3).setCellValue(true);
row.createCell(4).setCellValue(HSSFCell.CELL_TYPE_NUMERIC);
row.createCell(5).setCellValue(false);
FileOutputStream fileOut=new FileOutputStream("D:\\Cell.xls");
wb.write(fileOut);
fileOut.close();
}
}
效果图
遍历工作簿的行和列并获取单元格内容
定义一个输入流,前面我们学习的时候定义的是输出流,因为我们的最终的目的是为了把我们的数据用一个Excel表存起来,所以要把我们写的东西进行树春,输出的最终的地方就是我们的硬盘,现在我们是要进行数据的读取,所以我们需要定义一个输入流。
预先准备一个Excel
代码:
package poi_2;
import java.io.FileInputStream;
import java.io.InputStream;
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;
public class Demo3 {
public static void main(String[] args) throws Exception {
InputStream is=new FileInputStream("D:/text.xls");
POIFSFileSystem fs=new POIFSFileSystem(is);
HSSFWorkbook wb=new HSSFWorkbook(fs);
HSSFSheet hssfSheet=wb.getSheetAt(0);//获取第一个工作页
if (hssfSheet==null) {
return;
}
//遍历行Row
for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow=hssfSheet.getRow(rowNum);
if (hssfRow==null) {
continue;
}
//遍历具体的列
for (int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++) {
HSSFCell hssfCell=hssfRow.getCell(cellNum);
if (hssfCell==null) {
continue;
}
System.out.print(" "+getValue(hssfCell));
}
System.out.println();
}
}
private static String getValue(HSSFCell hssfCell){
//如果是boolean类型的值
if (hssfCell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN) {
return String.valueOf(hssfCell.getBooleanCellValue());
}else if (hssfCell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC) {
return String.valueOf(hssfCell.getNumericCellValue());
}else {
return String.valueOf(hssfCell.getStringCellValue());
}
}
}
结果
有点像读取一个数据库,我们在数据库先获取一个结果集,再对这个结果集进行遍历,就能得到这个表中的所有的数据。
文本提取
直接获取一个工作簿中的所有的东西
代码:
package poi_2;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* 文本提取
* @author Administrator
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
InputStream is=new FileInputStream("D:/text.xls");
POIFSFileSystem fs=new POIFSFileSystem(is);
HSSFWorkbook wb=new HSSFWorkbook(fs);//定义一个工作簿,这个工作簿是那个输入流获取到的
ExcelExtractor excelExtractor=new ExcelExtractor(wb);
excelExtractor.setIncludeSheetNames(false);//不显示工作簿的名字
System.out.println(excelExtractor.getText());
}
}
效果:
如果把false的那个去掉,显示的效果是这样的。
它会自动提取我的每个sheet页中的内容,并把工作簿中的内容是来自哪个sheet的显示出来,因为我一开始选择的是false,并且另外两个sheet页中的东西是空的,因此在这里就没有显示,就像上上个图一样,只显示了第一个sheet中的内容。