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对象读写。

接下来我们使用POI来实际操作。

引用JAR包

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</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 {

    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<>();
        URL url = new URL(path);
        InputStream is = url.openStream();
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            if (hssfSheet == null) {
                continue;
            }
            //第0,1行显示的标题,2行开始显示内容
            for (int rowNum = 2; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                Map<Integer,String> rowMap=new HashMap<>();
                if (hssfRow != null) {
                    try {
                        int hlength=hssfRow.getPhysicalNumberOfCells();
                        for(int i=0;i<hlength;i++){
                            String info=getValue(hssfRow.getCell(i));
                            logger.info("info="+info);
                            rowMap.put(i,info);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        logger.error("转换异常",e.getCause());
                    }
                }
                totalMap.put(rowNum-1,rowMap);
            }
        }
        return totalMap;
    }
    @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());
        }
    }
}

接下来只需要把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导入进来。

猜你喜欢

转载自blog.csdn.net/wszhm123/article/details/88866050