0
点赞
收藏
分享

微信扫一扫

JAVA中使用POI导出和导入EXCEL以及注意事项


在我们开发的时候,通常会遇到需要导入,导出一些数据的情况,这个时候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),这样才有效。

接下来是一个特别的事例:

JAVA中使用POI导出和导入EXCEL以及注意事项_POI

这种类型的代码如下:

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导入进来。

举报

相关推荐

0 条评论