Java POI导入导出Excel文件

news/2024/7/21 6:51:01 标签: poi, excel, 导入导出代码

Java POI Excel导入导出Excel文件

一、导入pom文件(版本号一定要相同,不然会报错

            <!--读取excel文件-->
                <dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.17</version>
      		</dependency>
            <!--导出excel文件-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.17</version>
		</dependency>

二、实现导出功能

@RequestMapping("/outPutExcel")
	public void outPutExcel(HttpServletResponse response) throws Exception {
		// 每次写100行数据,就刷新数据出缓存
		SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,
		Sheet sh = wb.createSheet();
        // 这个是业务数据
		List<TbClass> tmps = classService.getAllClass();
		String[] titles = { "编号", "标题" };
		Row row = sh.createRow(0);
		// 第一行设置标题
		for (int i = 0; i < titles.length; i++) {
			String title = titles[i];
			Cell cell1 = row.createCell(i);
			cell1.setCellValue(title);
		}

		// 导出数据
		for (int rowNum = 0; rowNum < tmps.size(); rowNum++) {

			Row rowData = sh.createRow(rowNum + 1);
            // TbClass 这个是我的业务类,这个是根据业务来进行填写数据
			TbClass tmp = tmps.get(rowNum);
            // 第一列
			Cell cellDataA = rowData.createCell(0);
			cellDataA.setCellValue(tmp.getcId());
            // 第二列
			Cell cellDataB = rowData.createCell(1);
			cellDataB.setCellValue(tmp.getcName());
		}

		String fileName = "文件名称.xlsx";
		response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
		wb.write(response.getOutputStream());
		wb.close();
	}

导出结果

导出时间类型

数据库使用时间类型,直接导出会出现以下这种情况。这个时候我们就需要处理一下时间类型。

用2种方法来解决时间转换字符串的方法

1、使用注解的方式

在属性类中添加注解属性类型就会转换成功啦,不过类型要改成String类型。(org.springframework.format.annotation 这个注解包是使用SpringMVC的类)

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private String createTime;

2、使用时间转换类,就不复制代码啦。createTime 是时间类的一个属性。

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (null != tmp.getCreateTime())
cellDataC.setCellValue(df.format(tmp.getCreateTime()));

实体类(想了一下,还是把实体类放上来吧)

    
public class TbClass {

    private Integer cId;

    private String cName;
    
    private String stuName;
    
    private Timestamp createTime;

    // 省略SetGet方法
}
  

二、实现导入功能

先画个图吧,这样我们按照图来走吧,让代码更加简单。

公共的代码是和技术框架无关的,大家可以参考一下的,使用的是Spring+SpringMVC+Mybatis的技术框架。

Excel测试文件:

 

jsp页面:

<form name="Form2" action="fileUpload" method="post"  enctype="multipart/form-data">
			<input type="file" name="test">
			<input type="submit" value="upload"/>
</form>

 

配置是有2种方式

xml文件中的配置:

<!-- 多部分文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     <property name="maxUploadSize" value="104857600" />
     <property name="maxInMemorySize" value="4096" />
     <property name="defaultEncoding" value="UTF-8"></property>
</bean>

在原始类中的配置:

@Bean
	public CommonsMultipartResolver multipartResolver(DataSource dataSource) throws PropertyVetoException {
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setDefaultEncoding("utf-8");
		multipartResolver.setMaxUploadSize(10485760000L);
		multipartResolver.setMaxInMemorySize(40960);
		return multipartResolver;
}

Controller类(这里接收文件)

    @ResponseBody
    @RequestMapping(value = "/fileUpload", method = RequestMethod.POST, produces="text/html;charset=UTF-8")
    public String  fileUpload2(@RequestParam("test") CommonsMultipartFile test) throws Exception {
        String path="E:/"+new Date().getTime()+test.getOriginalFilename();
        File newFile=new File(path);
        //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
        test.transferTo(newFile);
        POIUtil.readExcel(path);
        return "/success"; 
    }

POIUtil工具类

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.pojo.TbClass;

public class POIUtil {

	public static void readExcel(String fileName) throws Exception {

		InputStream is = new FileInputStream(new File(fileName));
		Workbook hssfWorkbook = null;
		if (fileName.endsWith("xlsx")) {
			hssfWorkbook = new XSSFWorkbook(is);// Excel 2007
		} else if (fileName.endsWith("xls")) {
			hssfWorkbook = new HSSFWorkbook(is);// Excel 2003

		}
		// HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
		// XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);
		TbClass tbClass = null;
		List<TbClass> list = new ArrayList<TbClass>();
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
			// HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
			Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
			if (hssfSheet == null) {
				continue;
			}
			// 循环行Row
			for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				Row hssfRow = hssfSheet.getRow(rowNum);
				if (hssfRow != null) {
					tbClass = new TbClass();
					Cell cId = hssfRow.getCell(0);
					Cell cName = hssfRow.getCell(1);
					// 处理具体的业务数据,把业务数据装到List中
					tbClass.setcId(Integer.parseInt(getStringValueFromCell(cId)));
					tbClass.setcName(cName.toString());
					list.add(tbClass);
				}
			}
		}
		// List中的数据就是在Excel中读取的内容
		for (TbClass tbClass2 : list) {
			// 在这里可以进行业务操作
			System.out.println(tbClass2.getcId());
			System.out.println(tbClass2.getcName());
		}

	}

	
	 public static String getStringValueFromCell(Cell cell) {
	        SimpleDateFormat sFormat = new SimpleDateFormat("MM/dd/yyyy");
	        DecimalFormat decimalFormat = new DecimalFormat("#.#");
	        String cellValue = "";
	        if(cell == null) {
	            return cellValue;
	        }
	        else if(cell.getCellType() == Cell.CELL_TYPE_STRING) {
	            cellValue = cell.getStringCellValue();
	        }

	        else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
	            if(HSSFDateUtil.isCellDateFormatted(cell)) {
	                double d = cell.getNumericCellValue();
	                Date date = HSSFDateUtil.getJavaDate(d);
	                cellValue = sFormat.format(date);
	            }
	            else {                
	                cellValue = decimalFormat.format((cell.getNumericCellValue()));
	            }
	        }
	        else if(cell.getCellType() == Cell.CELL_TYPE_BLANK) {
	            cellValue = "";
	        }
	        else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
	            cellValue = String.valueOf(cell.getBooleanCellValue());
	        }
	        else if(cell.getCellType() == Cell.CELL_TYPE_ERROR) {
	            cellValue = "";
	        }
	        else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
	            cellValue = cell.getCellFormula().toString();
	        }
	        return cellValue;
	    }
}

运行结果:

希望可以帮助到大家,最后在宣传一下我的技术公众号,欢迎大家关注微信公众号。

 


http://www.niftyadmin.cn/n/1087096.html

相关文章

沈阳网络赛G-Spare Tire【容斥】

17.64% 1000ms 131072KA sequence of integer \lbrace a_n \rbrace{an​} can be expressed as: \displaystyle a_n \left\{ \begin{array}{lr} 0, & n0\\ 2, & n1\\ \frac{3a_{n-1}-a_{n-2}}{2}n1, & n>1 \end{array} \right.an​⎩⎨⎧​0,2,23an−1​−an−…

让我们来聊聊Spring

初识Spring框架 Spring 框架是 Java 应用最广的框架&#xff0c;它的成功来源于理念&#xff0c;而不是技术本身&#xff0c;它的理念包括 IoC (Inversion of Control&#xff0c;控制反转) 和 AOP(Aspect Oriented Programming&#xff0c;面向切面编程)。 什么是Spring? S…

Java SWT编程基础

SWT常用组件列表及使用 https://blog.csdn.net/u013310025/article/details/52939452 SWT编程基础-控件和图形资源 https://blog.csdn.net/jianggujin/article/details/51302554转载于:https://www.cnblogs.com/jiftle/p/9647459.html

数据结构练习 链表2

上一篇数据结构练习1 #ifndef _LIST_H_ #define _LIST_H_ #include<stdlib.h> #include<stdio.h> #define INIT_VALUE 0; typedef int Type; typedef struct LNode {Type value;struct LNode *next; }ListData,*ListHead; ListHead init_List(); void insert_List(…

path.join()和path.resolve()的区别

现在写代码的时候有时候使用path.join(__dirname,dist)有时候用path.resolve(__dirname,dist)&#xff0c;都是能拼接处来一个绝对路径&#xff0c;但是具体有什么区别呢&#xff1f; 一、path.join()方法 path.join()方法是将多个参数字符串合并成一个路径字符串 console.log…

苹果正式发布Mac OS X Lion系统

北京时间6月7日&#xff0c;苹果年度开发者大会&#xff08;WWDC2011&#xff09;拉开帷幕&#xff0c;史蒂夫乔布斯出席了本次大会&#xff0c;并且发表主题演讲&#xff0c;并正式发布了全新的桌面操作系统Mac OS X Lion、移动操作系统iOS 5、以及云服务产品iCloud。 Mac OS …

使用jquery.qrcode.min.js生成二维码

现在很多业务都在使用二维码进行相关的业务实现&#xff0c;最近用到jquery.qrcode.min.js生成二维码&#xff0c;功能十分简单&#xff0c;记录下来方便以后使用。 jquery.qrcode.min.js是js的一个库。 主流的浏览器都支持&#xff1a;IE6~10, Chrome, Firefox, Safari, Oper…

备战金九银十,我总结了2019上半年100道Java后端研发面试题

"金九银十"跳槽季&#xff01;跳槽时时刻刻都在发生&#xff0c;但是我建议大家跳槽之前&#xff0c;先想清楚为什么要跳槽。切不可跟风&#xff0c;看到同事一个个都走了&#xff0c;自己也盲目的开始面试起来&#xff0c;期间也没有准备充分&#xff0c;到底是因为…