EXCEL上传POI

时间:2021-12-28 17:10:55

Java SpringMVC POI上传excel并读取文件内容

2017年11月27日 15:26:56 强人锁男。 阅读数:15329
 

用的SSM框架,所需要的jar包如图所示:EXCEL上传POI,链接地址:jar包下载  ,下面直接上代码。

1、ExcelUtil工具类

[java] view plain copy

 
 
  1. <span style="color:#993399;"><span style="font-size:18px;color:#993399;">import java.text.DecimalFormat;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Calendar;
  4. import java.util.Date;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. import org.apache.poi.hssf.usermodel.HSSFCell;
  8. import org.apache.poi.hssf.usermodel.HSSFDateUtil;
  9. import org.apache.poi.ss.usermodel.Cell;
  10. import org.apache.poi.ss.usermodel.DateUtil;
  11. import org.apache.poi.xssf.usermodel.XSSFCell;
  12. /**
  13. * Excel工具类
  14. * @author lp
  15. *
  16. */
  17. public class ExcelUtil {
  18. public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";
  19. public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx";
  20. public static final String EMPTY = "";
  21. public static final String POINT = ".";
  22. public static SimpleDateFormat sdf =   new SimpleDateFormat("yyyy/MM/dd");
  23. /**
  24. * 获得path的后缀名
  25. * @param path
  26. * @return
  27. */
  28. public static String getPostfix(String path){
  29. if(path==null || EMPTY.equals(path.trim())){
  30. return EMPTY;
  31. }
  32. if(path.contains(POINT)){
  33. return path.substring(path.lastIndexOf(POINT)+1,path.length());
  34. }
  35. return EMPTY;
  36. }
  37. /**
  38. * 单元格格式
  39. * @param hssfCell
  40. * @return
  41. */
  42. @SuppressWarnings({ "static-access", "deprecation" })
  43. public static String getHValue(HSSFCell hssfCell){
  44. if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
  45. return String.valueOf(hssfCell.getBooleanCellValue());
  46. } else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
  47. String cellValue = "";
  48. if(HSSFDateUtil.isCellDateFormatted(hssfCell)){
  49. Date date = HSSFDateUtil.getJavaDate(hssfCell.getNumericCellValue());
  50. cellValue = sdf.format(date);
  51. }else{
  52. DecimalFormat df = new DecimalFormat("#.##");
  53. cellValue = df.format(hssfCell.getNumericCellValue());
  54. String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length());
  55. if(strArr.equals("00")){
  56. cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));
  57. }
  58. }
  59. return cellValue;
  60. } else {
  61. return String.valueOf(hssfCell.getStringCellValue());
  62. }
  63. }
  64. /**
  65. * 单元格格式
  66. * @param xssfCell
  67. * @return
  68. */
  69. public static String getXValue(XSSFCell xssfCell){
  70. if (xssfCell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
  71. return String.valueOf(xssfCell.getBooleanCellValue());
  72. } else if (xssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
  73. String cellValue = "";
  74. if(XSSFDateUtil.isCellDateFormatted(xssfCell)){
  75. Date date = XSSFDateUtil.getJavaDate(xssfCell.getNumericCellValue());
  76. cellValue = sdf.format(date);
  77. }else{
  78. DecimalFormat df = new DecimalFormat("#.##");
  79. cellValue = df.format(xssfCell.getNumericCellValue());
  80. String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length());
  81. if(strArr.equals("00")){
  82. cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));
  83. }
  84. }
  85. return cellValue;
  86. } else {
  87. return String.valueOf(xssfCell.getStringCellValue());
  88. }
  89. }
  90. /**
  91. * 自定义xssf日期工具类
  92. * @author lp
  93. *
  94. */
  95. class XSSFDateUtil extends DateUtil{
  96. protected static int absoluteDay(Calendar cal, boolean use1904windowing) {
  97. return DateUtil.absoluteDay(cal, use1904windowing);
  98. }
  99. }</span></span>

2、ExcelRead:读取Excel类

[java] view plain copy

 
 
  1. package com.ssm.util;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import org.apache.poi.hssf.usermodel.HSSFCell;
  7. import org.apache.poi.hssf.usermodel.HSSFRow;
  8. import org.apache.poi.hssf.usermodel.HSSFSheet;
  9. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  10. import org.apache.poi.xssf.usermodel.XSSFCell;
  11. import org.apache.poi.xssf.usermodel.XSSFRow;
  12. import org.apache.poi.xssf.usermodel.XSSFSheet;
  13. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  14. import org.springframework.web.multipart.MultipartFile;
  15. /**
  16. * 读取Excel
  17. * @author lp
  18. *
  19. */
  20. public class ExcelRead {
  21. public int totalRows; //sheet中总行数
  22. public static int totalCells; //每一行总单元格数
  23. /**
  24. * read the Excel .xlsx,.xls
  25. * @param file jsp中的上传文件
  26. * @return
  27. * @throws IOException
  28. */
  29. public List<ArrayList<String>> readExcel(MultipartFile file) throws IOException {
  30. if(file==null||ExcelUtil.EMPTY.equals(file.getOriginalFilename().trim())){
  31. return null;
  32. }else{
  33. String postfix = ExcelUtil.getPostfix(file.getOriginalFilename());
  34. if(!ExcelUtil.EMPTY.equals(postfix)){
  35. if(ExcelUtil.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)){
  36. return readXls(file);
  37. }else if(ExcelUtil.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)){
  38. return readXlsx(file);
  39. }else{
  40. return null;
  41. }
  42. }
  43. }
  44. return null;
  45. }
  46. /**
  47. * read the Excel 2010 .xlsx
  48. * @param file
  49. * @param beanclazz
  50. * @param titleExist
  51. * @return
  52. * @throws IOException
  53. */
  54. @SuppressWarnings("deprecation")
  55. public List<ArrayList<String>> readXlsx(MultipartFile file){
  56. List<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
  57. // IO流读取文件
  58. InputStream input = null;
  59. XSSFWorkbook wb = null;
  60. ArrayList<String> rowList = null;
  61. try {
  62. input = file.getInputStream();
  63. // 创建文档
  64. wb = new XSSFWorkbook(input);
  65. //读取sheet(页)
  66. for(int numSheet=0;numSheet<wb.getNumberOfSheets();numSheet++){
  67. XSSFSheet xssfSheet = wb.getSheetAt(numSheet);
  68. if(xssfSheet == null){
  69. continue;
  70. }
  71. totalRows = xssfSheet.getLastRowNum();
  72. //读取Row,从第二行开始
  73. for(int rowNum = 1;rowNum <= totalRows;rowNum++){
  74. XSSFRow xssfRow = xssfSheet.getRow(rowNum);
  75. if(xssfRow!=null){
  76. rowList = new ArrayList<String>();
  77. totalCells = xssfRow.getLastCellNum();
  78. //读取列,从第一列开始
  79. for(int c=0;c<=totalCells+1;c++){
  80. XSSFCell cell = xssfRow.getCell(c);
  81. if(cell==null){
  82. rowList.add(ExcelUtil.EMPTY);
  83. continue;
  84. }
  85. rowList.add(ExcelUtil.getXValue(cell).trim());
  86. }
  87. list.add(rowList);
  88. }
  89. }
  90. }
  91. return list;
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. } finally{
  95. try {
  96. input.close();
  97. } catch (IOException e) {
  98. e.printStackTrace();
  99. }
  100. }
  101. return null;
  102. }
  103. /**
  104. * read the Excel 2003-2007 .xls
  105. * @param file
  106. * @param beanclazz
  107. * @param titleExist
  108. * @return
  109. * @throws IOException
  110. */
  111. public List<ArrayList<String>> readXls(MultipartFile file){
  112. List<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
  113. // IO流读取文件
  114. InputStream input = null;
  115. HSSFWorkbook wb = null;
  116. ArrayList<String> rowList = null;
  117. try {
  118. input = file.getInputStream();
  119. // 创建文档
  120. wb = new HSSFWorkbook(input);
  121. //读取sheet(页)
  122. for(int numSheet=0;numSheet<wb.getNumberOfSheets();numSheet++){
  123. HSSFSheet hssfSheet = wb.getSheetAt(numSheet);
  124. if(hssfSheet == null){
  125. continue;
  126. }
  127. totalRows = hssfSheet.getLastRowNum();
  128. //读取Row,从第二行开始
  129. for(int rowNum = 1;rowNum <= totalRows;rowNum++){
  130. HSSFRow hssfRow = hssfSheet.getRow(rowNum);
  131. if(hssfRow!=null){
  132. rowList = new ArrayList<String>();
  133. totalCells = hssfRow.getLastCellNum();
  134. //读取列,从第一列开始
  135. for(short c=0;c<=totalCells+1;c++){
  136. HSSFCell cell = hssfRow.getCell(c);
  137. if(cell==null){
  138. rowList.add(ExcelUtil.EMPTY);
  139. continue;
  140. }
  141. rowList.add(ExcelUtil.getHValue(cell).trim());
  142. }
  143. list.add(rowList);
  144. }
  145. }
  146. }
  147. return list;
  148. } catch (IOException e) {
  149. e.printStackTrace();
  150. } finally{
  151. try {
  152. input.close();
  153. } catch (IOException e) {
  154. e.printStackTrace();
  155. }
  156. }
  157. return null;
  158. }
  159. }

[java] view plain copy

 
 

3、Controller

[java] view plain copy

 
 
  1. /**
  2. * 转到Excel上传页面
  3. * @return
  4. * @author lp
  5. */
  6. @RequestMapping(value="/read")
  7. public String addExcel(){
  8. return "baseInfo/testExcel";
  9. }
  10. **
  11. * 读取Excel数据到数据库
  12. * @param file
  13. * @param request
  14. * @return
  15. * @throws IOException
  16. * @author lp
  17. */
  18. @RequestMapping(value="/readExcel")
  19. public ModelAndView readExcel(@RequestParam(value="excelFile") MultipartFile file,
  20. HttpServletRequest request,HttpSession session) throws IOException{
  21. ModelAndView mv = new ModelAndView();
  22. //判断文件是否为空
  23. if(file == null){
  24. mv.addObject("msg", "failed");
  25. mv.setViewName("excel_result");
  26. return mv;
  27. }
  28. String name = file.getOriginalFilename();
  29. long size = file.getSize();
  30. if(name == null || ExcelUtil.EMPTY.equals(name) && size==0){
  31. mv.addObject("msg", "failed");
  32. mv.setViewName("excel_result");
  33. return mv;
  34. }
  35. //读取Excel数据到List中
  36. List<ArrayList<String>> list = new ExcelRead().readExcel(file);
  37. //list中存的就是excel中的数据,可以根据excel中每一列的值转换成你所需要的值(从0开始),如:
  38. User user = null;
  39. List<User> liseUser = new ArrayList<User>();
  40. for(ArrayList<String> arr:list){
  41. user= new User();
  42. user.setAuthor(list.get(0));//每一行的第一个单元格
  43. listUser.add(user);
  44. }
  45. if(userService.saveBatchInsert(listUser)){
  46. mv.addObject("msg", "success");
  47. }else{
  48. mv.addObject("msg", "failed");
  49. }
  50. mv.setViewName("excel_result");
  51. return mv;
  52. }</span></span>
 

4、jsp

(1)主页面添加“Excel导入”

<a href="javascript:addExcel();"><em>Excel导入</em></a>function addExcel(){var dg = new $.dialog({title:'导入Excel',id:'excel',width:1000,height:400,iconTitle:false,cover:true,maxBtn:false,xButton:true,resize:false,page:'user/read.html',});dg.ShowDialog();}

(2)导入页面

[html] view plain copy

 
 
  1. <body>
  2. <form action="readExcel.html" enctype="multipart/form-data" method="post" id="batchAdd" name="batchAdd" target="result" onsubmit="return check();>
  3. <div style="margin: 30px;">
  4. <div><input id="excel_file" type="file" name="excelFile" size="50"/>
  5. </form>
  6. <iframe name="result" id="result" src="about:blank" frameborder="0" width="0" height="0"></iframe>
  7. </body>
  8. </html>
  9. <script type="text/javascript">
  10. var dg;
  11. $(document).ready(function(){
  12. dg = frameElement.lhgDG;
  13. dg.addBtn('ok','保存',function(){
  14. $("#batchAdd").submit();
  15. this.disabled=true;
  16. });
  17. });
  18. function success(){
  19. if(dg.curWin.document.forms[0]){
  20. dg.curWin.document.forms[0].action = dg.curWin.location+"";
  21. dg.curWin.document.forms[0].submit();
  22. }else{
  23. dg.curWin.location.reload();
  24. }
  25. dg.cancel();
  26. }
  27. function failed(){
  28. alert("上传失败!");
  29. }
  30. </script>

(3)提示页面

[html] view plain copy

 
 
  1. <body>
  2. <script type="text/javascript">
  3. var msg = "${msg}";
  4. if(msg=="success" || msg==""){
  5. alert("保存成功");
  6. parent.success();
  7. }else{
  8. parent.failed();
  9. }
  10. </script>
  11. </body>

5、service层

service
boolean saveBatchInsert(List<User> listUser);

serviceimpl
@Transactional
public boolean saveBatchInsert(List<User> listUser){
boolean flag = false;
if(listBaseInfo != null){
userMapper.batchInsert(listUser);
flag = true;
}
return flag;
}

6、dao层

void batchInsert(List<User> list);

7、xml(oracle)

[html] view plain copy

 
 
  1. <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="Id">
  2. insert into baseinfo(ID,Name,Sex,Birth,IdCardNo,Address,Tel,Author,AddDate,Status)
  3. <foreach collection="list" item="item" index="index" separator="union all">
  4. (select
  5. <span style="white-space:pre">    </span>#{item.id,jdbcType=NUMERIC},
  6. #{item.name,jdbcType=VARCHAR},
  7. #{item.sex,jdbcType=CHAR},
  8. #{item.birth,jdbcType=DATE},
  9. #{item.idCardNo,jdbcType=CHAR},
  10. #{item.address,jdbcType=VARCHAR},
  11. #{item.tel,jdbcType=VARCHAR},
  12. #{item.author,jdbcType=VARCHAR},
  13. #{item.addDate,jdbcType=DATE},
  14. #{item.status,jdbcType=CHAR}
  15. from dual)
  16. </foreach>
  17. </insert>
 

EXCEL上传POI的更多相关文章

  1. poi之Excel上传

    poi之Excel上传 @RequestMapping(value = "/import", method = RequestMethod.POST) public String ...

  2. excel上传和下载

    需要注意的地方: 1.js构造表单并提交 2.js中文传参encodeURI(encodeURI("中文")),action接收并转换value = URLDecoder.deco ...

  3. IT*系列(六)——Excel上传与解析,一套代码解决所有Excel业务上传,你Get到了吗

    前言 在日常开发当中,excel的上传与解析是很常见的.根据业务不同,解析的数据模型也都不一样.不同的数据模型也就需要不同的校验逻辑,这往往需要写多套的代码进行字段的检验,如必填项,数据格式.为了避免 ...

  4. Excel上传并读取数据

    最近一段时间,维护一个旧系统,其中有一个功能,是把Excel上传,并读取数据进行维护,然后转插入至SQL数据库中.下面Insus.NET使用asp.net 标准上传控件: <asp:FileUp ...

  5. 基于thinkphp5的Excel上传

    涉及知识点: thinkphp5.0: excel上传: mysql建立新表(基本的create语句): mysql ignore(避免重复插入): 主要功能: 通过在视图中上传excel文件,在my ...

  6. 2019&period;06&period;05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)

    一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...

  7. F9 excel上传

    1 在前台制定文件上传按钮 <div id="dataImport" class="mini-webuploader" pickerText=" ...

  8. 基于BootStrap的initupload&lpar;&rpar;实现Excel上传和获取excel中的数据

    简单说明:后边要做exl解析(还没做呢),所以先有一个excel的的上传以及获取excel中的数据,展示出来. 代码: //html代码 <div class="btn-group&q ...

  9. c&num; vs2010 excel 上传oracle数据

    excel 数据表上传到oracle数据库.过程例如以下: 1.打开本地excel文件 2.用OleDb连接excel文件 3.将来excel的数据读取到dataset中 4.把dataset 中数据 ...

随机推荐

  1. 14&period;linux按键驱动程序(一)

    按键驱动程序 本文学习主要包含按键硬件的实现.中断分层管理.按键定时器去抖.阻塞性驱动程序设计.这里面需要使用到混杂设备驱动和中断处理程序的内容. 一.创建按键混杂设备驱动模型 int key_ope ...

  2. 配置Tomcat 中文字符集问题

    找到Tomcat安装路径下的conf文件夹下的server.xml配置文件,修改配置Tomcat端口的标签"Connector",添加URIEncoding属性,代码如下: &lt ...

  3. Z-Stack 软件架构分析

    转自Z-Stack 软件架构分析 Z-Stack的main函数在Zmain.c中,总体上来说,它一共做了两件工作,一个是系统初始化,即有启动代码来初始化硬件系统和软件架构需要的各个模块,另一个作用就是 ...

  4. Javascript&colon;getElementsByClassName

    背景: 由于原生的getElementsByClassName不支持在指定标签中查找指定元素为指定class的情况,所以,这里舍弃了原生的方法调用   方法一: function getElement ...

  5. SQL Server 动态行转列&lpar;轉載&rpar;

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL, ...

  6. T&lowbar;SQL编程赋值、分支语句、循环

    咱们在C#中会常用到赋值.循环.分支语句什么的 今天咱们来看下当初在C#用到的一点东西放到SQL中是怎么使用的 创建变量 在C#中创建一个值类型变量很简单 int a:这就可以了 SQL: decla ...

  7. JavaScript高级程序设计之自学笔记(一)————Array类型

    以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...

  8. Ubuntu安装TensorFlow

    使用清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/ 下载. 在主界面右侧找到[相关链接]->[使用帮助],然后在出现的页面左侧找到Tensor ...

  9. day 7 编码

    menu = { '北京': { '朝阳': { '国贸': { 'CICC': {}, 'HP': {}, '渣打银行': {} }, '望京': { '陌陌': {}, '奔驰': {} } }, ...

  10. &lpar;后端&rpar;Java中关于金额大小写的工具类

    /** * 金额小数转换成中文大写金额 * * @author Neil Han * */ private static final String UNIT[] = { "万", ...