EXCEL数据上传到Mysql,从Mysql下载数据到EXCEL
总结一下最近项目中用到的excel和mysql数据同步流程(Springboot里面使用的jdbcTemplate,如果要集成mybatis或者jpa可以更改下写入/查询部分的代码即可),实现EXCEL数据上传到Mysql,从Mysql下载数据到EXCEL,不喜勿喷.
maven工具,使用spring Boot

1.测试表

2.pom.xml

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.2.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.10.1</version><scope>compile</scope></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.10.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>2.0.2.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

3.springboot启动

package com.huawei;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ExcelDemoApplication {public static void main(String[] args) {SpringApplication.run(ExcelDemoApplication.class, args);}
}

4.controller代码

package com.huawei.controller;import com.huawei.utils.CommUtil;
import com.huawei.utils.ExcelUtil;
import com.huawei.utils.JdbcUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;/*** Excel导入导出操作* @author songhj**/
@RestController
public class IndexViewController {private JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());/*** Excel数据导入* @param request* @param response* @param filePro* @return*/@RequestMapping(value="/importExcel")public Map<String, Object> importExcel(HttpServletRequest request,HttpServletResponse response, String filePro){Map<String, Object> map = new HashMap<>();String keys[] = {"id","dname","dlocal"};try {List<Map<String,String>> listData = ExcelUtil.getExcelData(request, "file",keys);if(listData.size() == 0){map.put("status",-1);map.put("message","上传失败,上传数据必须大于一条");return map;}//sql语句String sql = "insert into dept values (?,?,?)";for (Map<String, String> dataMap : listData) {//输出到控制台校验System.out.println(keys[0] + ":" + dataMap.get(keys[0]));System.out.println(keys[1] + ":" + dataMap.get(keys[1]));System.out.println(keys[2] + ":" + dataMap.get(keys[2]));jdbcTemplate.update(sql,dataMap.get(keys[0]),dataMap.get(keys[1]),dataMap.get(keys[2]));}map.put("listData", listData);map.put("code", 1);map.put("message", "导入成功");} catch (Exception e) {e.printStackTrace();}return map;}/*** 出具导出excel* @param request* @param response* @return* @throws IOException*/@RequestMapping(value = "/excelExport", method = { RequestMethod.GET, RequestMethod.POST })public Map<String,Object> excelExport(HttpServletRequest request, HttpServletResponse response) throws IOException {Map<String,Object> data = new HashMap<>();String fileName = CommUtil.formatTime("yyyyMMddHHmmss", new Date()) +".xls";String columnNames[] = {"编号","名称","地址"};String keys[] = {"id","dname","dlocal"};List<Map<String,Object>> listMap = new ArrayList<>();Map<String,Object> map = new HashMap<>();/*测试数据map.put("id", "50");map.put("dname", "物流部");map.put("dlocal", "深圳");listMap.add(map);map = new HashMap<>();map.put("id", "60");map.put("dname", "订单部");map.put("dlocal", "香港");listMap.add(map);*///查询写出String sql = "select * from dept";List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);for (Map<String, Object> map_d : list) {map = new HashMap<>();map.putAll(map_d);listMap.add(map);}try {//创建WorkbookWorkbook wb = ExcelUtil.createWorkBook(listMap, keys, columnNames);//保存路径String savePath = request.getServletContext().getRealPath("/") + File.separator + fileName;// 创建文件流OutputStream stream = new FileOutputStream(savePath);// 写入数据wb.write(stream);// 关闭文件流stream.close();//返回结果data.put("code", 1);String downloadUrl = request.getScheme() + "://"+request.getServerName() + ":" + request.getServerPort() + "/" + fileName;data.put("download", downloadUrl);data.put("message", "文件流输出成功");//控制台输出下载路径System.out.println("\n数据导出成功,下载路径:" + downloadUrl);} catch (IOException e) {System.err.println(e.getMessage());data.put("code", -1);data.put("message", "下载出错");return data;}return data;}}

5.commUtils

package com.huawei.utils;import java.text.SimpleDateFormat;
import java.util.Date;public class CommUtil {public static boolean isNotNull(Object obj) {if ((obj != null) && (!obj.toString().equals(""))) {return true;}return false;}public static Date formatDate(String s, String format) {Date d = null;try {SimpleDateFormat dFormat = new SimpleDateFormat(format);d = dFormat.parse(s);} catch (Exception localException) {}return d;}public static String formatShortDate(Object v) {if (v == null)return null;SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");return df.format(v);}public static String formatTime(String format, Object v) {if (v == null)return null;if (v.equals(""))return "";SimpleDateFormat df = new SimpleDateFormat(format);return df.format(v);}}

6.ExcelUtils(核心)

package com.huawei.utils;import org.apache.poi.hssf.usermodel.HSSFCell;
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.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.util.*;/*** Excel导出** @author song*/
public class ExcelUtil {/*** @param listMap     导出的数据* @param keys        取每列数据的key* @param columnNames 列名* @return*/public static Workbook createWorkBook(List<Map<String, Object>> listMap, String keys[], String columnNames[]) {// 创建excel工作簿Workbook wb = new HSSFWorkbook();// 创建第一个sheet(页),并命名Sheet sheet = wb.createSheet("Sheet1");// 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。for (int i = 0; i < keys.length; i++) {sheet.setColumnWidth((short) i, (short) (35 * 100));}/**// 创建两种单元格格式CellStyle cs = wb.createCellStyle();CellStyle cs2 = wb.createCellStyle();// 创建两种字体Font f = wb.createFont();Font f2 = wb.createFont();// 创建第一种字体样式(用于列名)f.setFontHeightInPoints((short) 10);f.setColor(IndexedColors.BLACK.getIndex());f.setBoldweight(Font.BOLDWEIGHT_BOLD);// 创建第二种字体样式(用于值)f2.setFontHeightInPoints((short) 10);f2.setColor(IndexedColors.BLACK.getIndex());// 设置第一种单元格的样式(用于列名)cs.setFont(f);cs.setBorderLeft(CellStyle.BORDER_THIN);cs.setBorderRight(CellStyle.BORDER_THIN);cs.setBorderTop(CellStyle.BORDER_THIN);cs.setBorderBottom(CellStyle.BORDER_THIN);cs.setAlignment(CellStyle.ALIGN_CENTER);// 设置第二种单元格的样式(用于值)cs2.setFont(f2);cs2.setBorderLeft(CellStyle.BORDER_THIN);cs2.setBorderRight(CellStyle.BORDER_THIN);cs2.setBorderTop(CellStyle.BORDER_THIN);cs2.setBorderBottom(CellStyle.BORDER_THIN);cs2.setAlignment(CellStyle.ALIGN_CENTER);*/// 创建第一行Row row = sheet.createRow((short) 0);//设置列名for (int i = 0; i < columnNames.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(columnNames[i]);/**cell.setCellStyle(cs);*/}//设置每行每列的值for (short i = 0; i < listMap.size(); i++) {// Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的// 创建一行,在页sheet上Row row1 = sheet.createRow((short) i + 1);// 在row行上创建一个方格for (short j = 0; j < keys.length; j++) {Cell cell = row1.createCell(j);cell.setCellValue(listMap.get(i).get(keys[j]) == null ? " " : listMap.get(i).get(keys[j]).toString());/**cell.setCellStyle(cs2);*/}}return wb;}/*** 获取导入Excel的数据** @param request* @param filePro* @param keys* @return*/public static List<Map<String, String>> getExcelData(HttpServletRequest request, String filePro, String keys[]) {List<Map<String, String>> data = new ArrayList<>();try {if (!CommUtil.isNotNull(filePro)) {filePro = "file";}MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;MultipartFile file = (MultipartFile) multipartRequest.getFile(filePro);//获得文件名String fileName = file.getOriginalFilename();Workbook wb = null;if (fileName.endsWith("xlsx")) {wb = new XSSFWorkbook(file.getInputStream());} else {wb = new HSSFWorkbook(file.getInputStream());}//获得第一个表单Sheet sheet = wb.getSheetAt(0);//获得第一个表单的迭代器Iterator<Row> rows = sheet.rowIterator();int i = 0;while (rows.hasNext()) {i++;Map<String, String> rowMap = new HashMap<>();//获得行数据Row row = rows.next();//跳过头部if (row.getRowNum() == 0) {continue;}Iterator<Cell> cells = row.cellIterator();//获得行的迭代器int j = 0, k = 0;while (cells.hasNext()) {Cell cell = cells.next();//类型判断String key = "";//防止越界if (keys.length > cell.getColumnIndex()) {key = keys[cell.getColumnIndex()];}if (CommUtil.isNotNull(key)) {String value = formatCell(cell);rowMap.put(key, value);if (!CommUtil.isNotNull(value)) {j++; //记录空值得数量}k++; //记录多少列}}//如果i=j,说明一行都是空的if (j == k) {break;} else {data.add(rowMap);}if (i > 50001) {System.out.println("\n============导入数据大于五万条,立即停止===============");break;}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return data;}/*** 反射机制 map转实体** @param classPath java类路径* @param listData  map数据* @return*/public static List<Object> factoryMapToJavaObj(String classPath, List<Map<String, String>> listData) {List<Object> list = new ArrayList<Object>();try {//获取类Class<?> c = Class.forName(classPath);//获取类的所有属性Field[] fs = c.getDeclaredFields();Object valObj = null;for (Map<String, String> mapData : listData) {//获取类的一个实例Object o = c.newInstance();for (Field field : fs) {String fieldName = field.getName();String fieldType = field.getType().getName();String value = mapData.get(fieldName);if (CommUtil.isNotNull(value)) {valObj = value.trim();} else {valObj = null;}if (Modifier.toString(field.getModifiers()).indexOf("static") != -1 || fieldName.equals("id")) {continue;}if (fieldType.equals("java.math.BigDecimal")) {if (CommUtil.isNotNull(valObj)) {if (valObj.toString().indexOf("%") != -1) {String newVal = valObj.toString().replaceAll("%", "");Double num = Double.valueOf(newVal) / 100;valObj = BigDecimal.valueOf(num);} else {valObj = BigDecimal.valueOf(Double.valueOf(value.replace(",", "")));}} else {valObj = BigDecimal.valueOf(0);}}if (fieldType.equals("java.util.Date") && CommUtil.isNotNull(value)) {valObj = CommUtil.formatDate(value.replace("/", "-"), "yyyy-MM-dd");}if (fieldType.equals("java.lang.Integer")) {if (CommUtil.isNotNull(valObj)) {valObj = Integer.valueOf(valObj.toString());} else {valObj = Integer.valueOf(0);}}if (fieldType.equals("java.lang.Long")) {if (CommUtil.isNotNull(valObj)) {valObj = Long.valueOf(valObj.toString());} else {valObj = Long.valueOf(0);}}if (CommUtil.isNotNull(valObj)) {//设置可访问私有属性field.setAccessible(true);//给o对象的属性赋值field.set(o, valObj);}}list.add(o);}} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}return list;}public static void main(String[] args) {//      Map<String, String> map = new HashMap<>();
//      List l = new ArrayList<>();
//      l.add(map);
//      new ExcelUtil().factoryMapToJavaObj("com.qhiex.foundation.domain.po.system.BusMediInterface", l);}/*** 按类型取值* @param cell* @return*/public static String formatCell(Cell cell) {if (cell == null) {return "";}switch (cell.getCellType()) {//数值格式case HSSFCell.CELL_TYPE_NUMERIC:if (HSSFDateUtil.isCellDateFormatted(cell)) {//如果是日期格式return CommUtil.formatShortDate(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));} else {//字符时cell.setCellType(HSSFCell.CELL_TYPE_STRING);return cell.getStringCellValue();}//字符串case HSSFCell.CELL_TYPE_STRING:return cell.getStringCellValue();// 公式case HSSFCell.CELL_TYPE_FORMULA:return cell.getCellFormula();// 空白case HSSFCell.CELL_TYPE_BLANK:return "";// 布尔取值case HSSFCell.CELL_TYPE_BOOLEAN:return cell.getBooleanCellValue() + "";//错误类型case HSSFCell.CELL_TYPE_ERROR:break;}return "";}}

7.jdbcUtils

package com.huawei.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** @author YangShuixiang`_`* @date 2018/12/12 16:05*/
public class JdbcUtils {private static DataSource ds;// 2. 创建连接池对象static {// 加载配置文件中的数据InputStream is = JdbcUtils.class.getResourceAsStream("/druid.properties");Properties pp = new Properties();try {pp.load(is);// 创建连接池,使用配置文件中的参数ds = DruidDataSourceFactory.createDataSource(pp);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}// 3. 定义公有的得到数据源的方法public static DataSource getDataSource() {return ds;}// 4. 定义得到连接对象的方法public static Connection getConnection() throws SQLException {return ds.getConnection();}// 5.定义关闭资源的方法public static void close(Connection conn, Statement stmt, ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {}}if (conn != null) {try {conn.close();} catch (SQLException e) {}}}// 6.重载关闭方法public static void close(Connection conn, Statement stmt) {close(conn, stmt, null);}
}

8.Html页面,随便写个,下面截图仅供参考
访问路径:http://127.0.0.1:8080/index.html
页面a标签需要注意id,与代码区保持一致
样式要不要无所谓

EXCEL与Mysql数据相互同步---EXCEL数据上传到Mysql,从Mysql下载数据到EXCEL__1相关推荐

  1. EXCEL与Mysql数据相互同步---EXCEL数据上传到Mysql,从Mysql下载数据到EXCEL__2

    使用mybatis,maven,springboot 排版比较乱,但是都复制全了,不调了自己记录下 导出是全部导出的需求场景,正常业务中有按时间/操作人/等等等条件的- 依赖 <parent&g ...

  2. XML 数据 BCP方式大批量的上传--学习(一)

    1.是用xml数据,来进行解析上传数据. 2.例如: 3.  <Batch batchNo="20100617">           <Code Code=&q ...

  3. ajax实现下拉列表回显,layui实现下拉复选功能的例子(包括数据的回显与上传)

    一.layui下拉复选实现的背景:实现一个管理员拥有多个权限 二. 具体实现: //依赖资源 //页面显示 角色: xm-select-search xm-select-skin="defa ...

  4. ajax文件后台提交,有关文件上传 非ajax提交 得到后台数据问题

    下文给大家介绍文件上传非ajax提交得到后台数据的操作方法,具体详情如下所示: .......... 根据id获得表单数据然后发送ajax请求,获得后台返回数据,处理数据,完美. 但是如果需要上传文件 ...

  5. 毕设 CC2530+esp8266使用AT指令上传与获取onenet服务器的数据

    CC2530+esp8266使用AT指令上传与获取onenet服务器的数据 我们首先看效果视频, VID_20221023_175149(0)(0) 我一开始做这个项目的时候我发现对于这个CC2530 ...

  6. 毕业设计——音乐播放系统 可以自己上传歌曲 SSM框架 MYSQL数据库 功能齐全

    音乐播放系统 可以自己上传歌曲 SSM框架 MYSQL数据库 功能齐全 可以注册账号 登录 在线上传歌曲 发表评论 在线听音乐 登录 注册 首页 播放音乐以及在线评论 个人后台页面 查看我发布的以及上 ...

  7. MySQL自动备份脚本和ftp上传脚本

    MySQL自动备份脚本,并上传ftp 在日常的工作中Mysql数据库备份是长期需要去做的一件运维工作,但是人工手动去做这一机械的动作确实必要性不高,所以写个脚本来跑是比较好的. mysql备份脚本 # ...

  8. 上传文件页面回显_数据回显、删除以及excel导出

    数据回显 当点击某个按钮跳转某个页面之前,发送请求到后台进行数据查询,最后将查询结果返回给前端页面,前端页面获取数据,最后呈现出来的效果是就回显的效果. 示例代码: 前端代码: Controller ...

  9. php读取excel数据在页面显示,PHP上传多个Excel表格里的数据到数据库然后在页面显示...

    //上传excelpublic function uploadExcel(){ //获取当前的请求信息,或者使用助手函数request() $request = hinkRequest::instan ...

最新文章

  1. MO-JAVA-2.1学习--1
  2. db2 删除schema中所有表_常用SQL系列之(六):删除方式、数据库、表及索引元信息查询等...
  3. 13张PPT带你了解主动式消息队列处理集群
  4. JMS 2.0的新增功能
  5. 137_Power BI 自定义矩阵复刻Beyondsoft Calendar
  6. Cordova自定义插件
  7. c语言函数编写格式,在c语言中如何实现函数模板?
  8. bazel 链接第三方动态库_如何自己制作静态库?
  9. 1.6 开发集合测试集的大小
  10. jstl的formatNumber标签的四舍五入问题
  11. 2018贝壳找房研发校招笔试题
  12. Java 13 发布进入倒计时!
  13. 4.1 选择IDC机房 4.2 硬件服务器选型 4.3 上架服务器 4.4/4.5 装系统
  14. tensorflow中的py_function与watch
  15. NI 国家仪器 各版本软件下载链接
  16. PaddleHub创意项目 | 将霉霉P到埃菲尔铁塔前
  17. element-vue admin 右击路由选项 利用fullscreen实现全局页面全屏
  18. P1526 [NOI2003] 智破连环阵 题解
  19. 已有一个排好序的数组,由键盘输入一个数,要求按原来的排序规律将其插入到数组中.
  20. 动态规划 资源分配问题

热门文章

  1. cs战队服务器位置,【历史】世界著名CS战队资料大全|与CS战队以及战队官方网站一览...
  2. 如何用c语言产生1kHz的声音,输出1KHz和500Hz的音频信号驱动扬声器
  3. android-skin-support使用和原理分析
  4. 用Java Onvif 实现OSD获取和添加
  5. 武汉大学计算机学院出国,2017年6月武汉大学研究生出国交流资助项目评审结果公示...
  6. 为什么计算机与打印机不同网络,几台电脑不同,可以连同一台打印机吗?
  7. 【对讲机的那点事】自制VHF/UHF四分之一波长天线简易教程
  8. function和polynomial的关系
  9. 家居建材供应链模式盘点,数商云供应链SCM系统助力企业做好采购计划管理
  10. 【解决】VLC Player播放视频有声音无画面的问题-禁止硬件加速