Java通过不同的方式上传Excel文档

Posted TGB-Earnest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java通过不同的方式上传Excel文档相关的知识,希望对你有一定的参考价值。

说明

有时候我们需要上传文档,然后解析文档进行业务逻辑的处理,再存储到数据库中,如何读取文档的形式很多,接下来我们来一 一解析。

对比

(1)POI

首先我们引入相关的依赖

		<!--poi-ooxml-->
			<dependency>
				<groupId>org.apache.poi</groupId>
				<artifactId>poi-ooxml</artifactId>
				<version>3.9</version>
			</dependency>

我们需要用 MultipartFile[] file 来进行接受Excel
MultipartFile工具类
MultipartFile是SpringMVC提供简化上传操作的工具类。
在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换成File类。使用MultipartFile工具类之后,我们对文件上传的操作就简单多了。

public interface MultipartFile 
    //参数名称
    String getName();
    //源文件的名称
    String getOriginalFilename();
    //返回文件的内容类型
    String getContentType();
    //判断是否为空,或者上传的文件是否有内容
    boolean isEmpty();
    //返回文件大小,以字节为单位
    long getSize();
    //将文件内容转成byte[]返回
    byte[] getBytes() throws IOException;
    //返回InputStream读取文件的内容
    InputStream getInputStream() throws IOException;
    //用来把MultipartFile转换成File
    void transferTo(File var1) throws IOException, IllegalStateException;

知道了MultipartFile的类方法,我们就可以对文件进行操作了。

//文件类型
					String filetype = "";
					//文件名称
					String fileName = "";
					if(myfile.getOriginalFilename() != null && !"".equals(myfile.getOriginalFilename()))
						filetype = myfile.getOriginalFilename().substring(myfile.getOriginalFilename().indexOf(".") + 1,myfile.getOriginalFilename().length());
						fileName = myfile.getOriginalFilename().substring(0,myfile.getOriginalFilename().indexOf("."));
					
					 //判断文件格式是否正确
					if (!"xls".equals(filetype) &&  !"xlsx".equals(filetype)) 
						model.put("message", "请选择正确的Excel文件上传!");
						return b(request, model, null);
						
          
             if("xls".equals(filetype))
	    	a = ExcelUtilForBaidu.readExcel2003ZhitouAppKeyword(inputStream,username);
	    else
	    	a = ExcelUtilForBaidu.readExcel2007ZhitouAppKeyword(inputStream,username);
	    

然后我们将inputStream进行转换

XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

然后我们以InputStream的形式传入,读取Excel文件的内容。

写在最前面:    使用的是JAVA POI实现的导出Excel;    POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook    POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook   引入相关依赖:
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
 /**
     * 读取Excel文件的内容
     * @param inputStream excel文件,以InputStream的形式传入
     * @param sheetName sheet名字
     * @return 以List返回excel中内容
     */
    public static List<Map<String, String>> readExcel(InputStream inputStream, String sheetName) 

        //定义工作簿
        XSSFWorkbook xssfWorkbook = null;
        try 
            xssfWorkbook = new XSSFWorkbook(inputStream);
         catch (Exception e) 
            System.out.println("Excel data file cannot be found!");
        

        //定义工作表
        XSSFSheet xssfSheet;
        if (sheetName.equals("")) 
            // 默认取第一个子表
            xssfSheet = xssfWorkbook.getSheetAt(0);
         else 
            xssfSheet = xssfWorkbook.getSheet(sheetName);
        

        List<Map<String, String>> list = new ArrayList<Map<String, String>>();

        //定义行
        //默认第一行为标题行,index = 0
        XSSFRow titleRow = xssfSheet.getRow(0);

        //循环取每行的数据
        for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) 
            XSSFRow xssfRow = xssfSheet.getRow(rowIndex);
            if (xssfRow == null) 
                continue;
            

            Map<String, String> map = new LinkedHashMap<String, String>();
            //循环取每个单元格(cell)的数据
            for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++) 
                XSSFCell titleCell = titleRow.getCell(cellIndex);
                XSSFCell xssfCell = xssfRow.getCell(cellIndex);
                map.put(getString(titleCell),getString(xssfCell));
            
            list.add(map);
        
        return list;
    

    /**
     * 把单元格的内容转为字符串
     * @param xssfCell 单元格
     * @return 字符串
     */
    public static String getString(XSSFCell xssfCell) 
        if (xssfCell == null) 
            return "";
        
        if (xssfCell.getCellTypeEnum() == CellType.NUMERIC) 
            return String.valueOf(xssfCell.getNumericCellValue());
         else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) 
            return String.valueOf(xssfCell.getBooleanCellValue());
         else 
            return xssfCell.getStringCellValue();
        
    

    /**
     * 把内容写入Excel
     * @param list 传入要写的内容,此处以一个List内容为例,先把要写的内容放到一个list中
     * @param outputStream 把输出流怼到要写入的Excel上,准备往里面写数据
     */
    public static void writeExcel(List<List> list, OutputStream outputStream) 
        //创建工作簿
        XSSFWorkbook xssfWorkbook = null;
        xssfWorkbook = new XSSFWorkbook();

        //创建工作表
        XSSFSheet xssfSheet;
        xssfSheet = xssfWorkbook.createSheet();

        //创建行
        XSSFRow xssfRow;

        //创建列,即单元格Cell
        XSSFCell xssfCell;

        //把List里面的数据写到excel中
        for (int i=0;i<list.size();i++) 
            //从第一行开始写入
            xssfRow = xssfSheet.createRow(i);
            //创建每个单元格Cell,即列的数据
            List sub_list =list.get(i);
            for (int j=0;j<sub_list.size();j++) 
                xssfCell = xssfRow.createCell(j); //创建单元格
                xssfCell.setCellValue((String)sub_list.get(j)); //设置单元格内容
            
        

        //用输出流写到excel
        try 
            xssfWorkbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        catch (IOException e) 
            e.printStackTrace();
        

    

持续更新中…

以上是关于Java通过不同的方式上传Excel文档的主要内容,如果未能解决你的问题,请参考以下文章

Java通过不同的方式上传Excel文档

Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

几种不同的excel转换成pdf方式

怎样通过JSP页面上传个Excel文件,并实现Java读取EXCEL存入数据库

Java动态填充word文档并上传到服务器

[原创]Java动态填充word文档并上传到服务器