在我们开发的时候,通常会遇到需要导入,导出一些数据的情况,这个时候POI提供了一个非常好的这些操作。所以接下来我们将讲述如何完成这些操作。
首先
我们介绍下POI中的一些组件;
常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾(只有打印的时候才能看到效果)
样式:
HSSFCellStyle cell样式
辅助操作包括:
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
其次
Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
基本操作步骤:
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。
以上只能导入xls的文件不能导入xlsx的。所以需要XSSFWorkFont,基本上都一样。就是把H改成X就行。
接下来我们使用POI来实际操作。
引用JAR包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
这样就会把POI所需要的JAR包引入过来。
下面是简单的事例:
//创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建HSSFSheet对象
HSSFSheet sheet = wb.createSheet();
CellRangeAddress region1 = new CellRangeAddress(0,0,(short)0,(short)2);
sheet.addMergedRegion(region1);
sheet.createRow(0).createCell(0).setCellValue("第一行前三个");
CellRangeAddress region2 = new CellRangeAddress(1,1,(short)0,(short)2);
sheet.addMergedRegion(region2);
sheet.createRow(1).createCell(0).setCellValue("第二行前三个");
//第一行3,4,5合并
CellRangeAddress region3 = new CellRangeAddress(0,0,(short)3,(short)5);
sheet.addMergedRegion(region3);
sheet.createRow(0).createCell(3).setCellValue("第一行3,4,5");
//输出Excel文件
FileOutputStream output=new FileOutputStream("C:\\data\\data1.xls");
wb.write(output);
output.flush()
需要特别说明的是,当我们合并单元格的时候,当我们队单元格设置文字的时候,createCell()时需要填写的列数,不是合并后的列数,而是原来的列数,如:第一行0,1,2,3列合并成一个单元格,4,5,6合并成一个单元格,这样,设置第二个单元格的时候createCell(4),这样才有效。
接下来是一个特别的事例:
这种类型的代码如下:
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
HSSFRow row = sheet.createRow((short)0);
HSSFCell cell = row.createCell((short)0);
sheet.setColumnWidth(0,(short)(381 * 40 ));
row.setHeight((short) (156.75 * 20 ));
cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setWrapText(true);// 指定单元格自动换行
cell.setCellStyle(cellStyle);
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 24); // 字体高度
font.setFontName("宋体"); // 字体
HSSFFont font1 = workbook.createFont();
font1.setFontHeightInPoints((short) 8); // 字体高度
font1.setFontName("宋体"); // 字体
HSSFRichTextString ts= new HSSFRichTextString(" 入库标签\r\n 物料名称:火灾报警探头探测器(含底座、过渡板;电气柜内安装)\r\n发运计划号:20130731-01-01\r\n\r\n 图号:CCDZ120A-220-001\r\n\r\nSAP物料号:CNR0000009938\r\n\r\n 项目名称:上海地铁6号线增购车\r\n\r\n 数量:100");
ts.applyFont(0,10,font);
ts.applyFont(10,ts.length(),font1);
cell.setCellValue(ts);
FileOutputStream fOut = new FileOutputStream("C:\\data\\test.xls");
workbook.write(fOut);
fOut.flush();
fOut.close();
System.out.println("文件生成...");
参考链接:你还可以看这个。
上面的内容是导出的内容,但是导入也是必须要了解的
准备相应的相应的ImportExcel.
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/**
* EXCEL导入
* Created by 赵红明 on 2019/3/28.
*/
public class ImportExcel {
final static Pattern pattern = Pattern.compile("\\S*[?]\\S*");
private static final Logger logger= LoggerFactory.getLogger(ImportExcel.class);
public Map<Integer,Map<Integer,String>> readXls(String path) throws IOException {
Map<Integer,Map<Integer,String>> totalMap=new HashMap<Integer,Map<Integer,String>>();
URL url = new URL(path);
InputStream is = url.openStream();
if(parseSuffix(path).equals("xlsx")){
XSSFWorkbook hssfWorkbooks = new XSSFWorkbook(is);
for (int numSheet = 0; numSheet < hssfWorkbooks.getNumberOfSheets(); numSheet++) {
XSSFSheet hssfSheet = hssfWorkbooks.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
for (int rowNum = 2; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
XSSFRow hssfRow = hssfSheet.getRow(rowNum);
Map<Integer,String> rowMap=new HashMap<Integer,String>();
if (hssfRow != null) {
try {
int hlength=hssfRow.getPhysicalNumberOfCells();
for(int i=0;i<hlength;i++){
System.out.println("第"+i+"行出现异常");
String info=getXValue(hssfRow.getCell(i));
logger.info("info="+i+"=="+info);
rowMap.put(i,info);
}
} catch (Exception e) {
e.printStackTrace();
logger.error("转换异常",e.getCause());
}
}
totalMap.put(rowNum-1,rowMap);
}
}
}else{
HSSFWorkbook hssfWorkbook =new HSSFWorkbook(is) ;
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
for (int rowNum = 2; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
Map<Integer,String> rowMap=new HashMap<Integer,String>();
if (hssfRow != null) {
try {
int hlength=hssfRow.getPhysicalNumberOfCells();
for(int i=0;i<hlength;i++){
System.out.println("第"+i+"行出现异常");
String info=getValue(hssfRow.getCell(i));
logger.info("info="+i+"=="+info);
rowMap.put(i,info);
}
} catch (Exception e) {
e.printStackTrace();
logger.error("转换异常",e.getCause());
}
}
totalMap.put(rowNum-1,rowMap);
}
}
}
return totalMap;
}
/**
* xls的获取
* @param hssfCell
* @return
*/
@SuppressWarnings("static-access")
private String getValue(HSSFCell hssfCell) {
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());
}
}
/**
* xlsx的获取
* @param hssfCell
* @return
*/
@SuppressWarnings("static-access")
private String getXValue(XSSFCell hssfCell) {
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());
}
}
/**
* 获取链接的后缀名
* @return
*/
private static String parseSuffix(String url) {
Matcher matcher = pattern.matcher(url);
String[] spUrl = url.toString().split("/");
int len = spUrl.length;
String endUrl = spUrl[len - 1];
if(matcher.find()) {
String[] spEndUrl = endUrl.split("\\?");
return spEndUrl[0].split("\\.")[1];
}
return endUrl.split("\\.")[1];
}
}
接下来只需要把excel的url上传进去就行。
ImportExcel imprort=new ImportExcel();
Map map=imprort.readXls("URL地址");
String errInfo="";
if(map!=null&&map.size()>0){
for(int i=1;i<=map.size();i++){
Map info=(Map) map.get(i);
if(info!=null){
Object productSku=info.get(0);
Object productName=info.get(28);
if(productName!=null&&!productName.equals("")){
}else{
errInfo+="第"+i+"行:"+productSku+"没有填写备注";
continue;
}
}
}
System.out.println("errorInfo="+errInfo);
}
这样就可以把url导入进来。