步骤:0.在Mysql数据库中先建好table

1.从Excel表格读数据

2.用JDBC连接Mysql数据库

3.把读出的数据导入到Mysql数据库的相应表中

其中,步骤0的table我是先在Mysql数据库中建好的,也可以用JDBC连上数据库以后再建表;步骤1的代码是网上找的;其他部分都是我自己写的。

之前我自己写的部分还被误删了,后来又重新写了。所以就想把代码放到网上,也算做个备份。说不定以后有用呢。

前两天又想到可以把代码放到github上面,也不错。

这里呢,我就把代码一股脑全粘在这里(原谅我太懒)。

jar包:

除了mysql-connector-java-5.1.45-bin.jar,其他都是读取Excel数据用的。

然后是代码:

Util.java:

  1. package FileUtil;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6.  
  7. public class Util {
  8.  
  9. private static String[] filepathofall = new String[1000000];
  10. private static int k = 0; //k为文件总数
  11.  
  12. private static boolean matchType(File file, String fileTypes) {
  13. boolean rt = false;
  14. String fExtName = file.getPath();
  15. int i = fExtName.lastIndexOf('.');
  16. if (i >= 0) {
  17. fExtName = fExtName.substring(i);
  18. fExtName = fExtName.toLowerCase();
  19. i = fileTypes.indexOf(fExtName);
  20. if (i >= 0)
  21. if (i + fExtName.length() >= fileTypes.length() || fileTypes.charAt(i + fExtName.length()) == ',')
  22. rt = true;
  23. }
  24. return rt;
  25. }
  26.  
  27. public static String[] fileList(String filepath, String fileTypes) throws FileNotFoundException, IOException {
  28. File file = new File(filepath);
  29. if (!file.isDirectory()) {
  30. if (matchType(file, fileTypes)) {
  31. System.out.println("absolutepath=" + file.getAbsolutePath());
  32. }
  33. } else if (file.isDirectory()) {
  34. String[] filelist = file.list();
  35. for (int i = 0; i < filelist.length; i++) {
  36. File readfile = new File(filepath + "\\" + filelist[i]);
  37. if (!readfile.isDirectory()) {
  38. if (matchType(readfile, fileTypes)) {
  39. //System.out.println("absolutepath=" + readfile.getAbsolutePath());
  40. filepathofall[k++] = readfile.getAbsolutePath();
  41. }
  42. } else if (readfile.isDirectory()) {
  43. fileList(filepath + "/" + filelist[i], fileTypes);
  44. }
  45. }
  46. }
  47. return filepathofall;
  48. }
  49. }

ImportDataFromExcelToMysql.java:

  1. package ImportData;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.Date;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10.  
  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  12. import org.apache.poi.ss.usermodel.Cell;
  13. import org.apache.poi.ss.usermodel.DateUtil;
  14. import org.apache.poi.ss.usermodel.Row;
  15. import org.apache.poi.ss.usermodel.Sheet;
  16. import org.apache.poi.ss.usermodel.Workbook;
  17. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20.  
  21. import FileUtil.Util;
  22.  
  23. import com.mysql.jdbc.Connection;
  24. import java.sql.*;
  25.  
  26. public class ImportDataFromExcelToMysql {
  27. private Logger logger = LoggerFactory.getLogger(ImportDataFromExcelToMysql.class);
  28. private Workbook wb;
  29. private Sheet sheet;
  30. private Row row;
  31. private static String[] filepathlist; //文件名列表
  32. private static boolean titleflag = false;//判断标题是否为数据
  33.  
  34. public ImportDataFromExcelToMysql(String filepath) {
  35. if (filepath == null) {
  36. return;
  37. }
  38. String ext = filepath.substring(filepath.lastIndexOf("."));//获取文件格式
  39. try {
  40. InputStream is = new FileInputStream(filepath);
  41. if (".xls".equals(ext)) {
  42. wb = new HSSFWorkbook(is);
  43. } else if (".xlsx".equals(ext)) {
  44. wb = new XSSFWorkbook(is);
  45. } else {
  46. wb = null;
  47. }
  48. } catch (FileNotFoundException e) {
  49. logger.error("FileNotFoundException", e);
  50. } catch (IOException e) {
  51. logger.error("IOException", e);
  52. }
  53. }
  54.  
  55. /**
  56. * 读取Excel表格表头的内容
  57. */
  58. public String[] readExcelTitle() throws Exception {
  59. titleflag = false;
  60. if (wb == null) {
  61. throw new Exception("Workbook对象为空!");
  62. }
  63.  
  64. sheet = wb.getSheetAt(0);
  65. row = sheet.getRow(0);
  66.  
  67. // 标题总列数
  68. int colNum = row.getPhysicalNumberOfCells();
  69. System.out.println(colNum);
  70. String[] title = new String[colNum];
  71. for (int i = 0; i < colNum; i++) {
  72. //title[i] = getStringCellValue(row.getCell((short) i));
  73. title[i] = getCellFormatValue(row.getCell(i)).toString();
  74. }
  75.  
  76. //判断title第一个字段是否为数字,即可知道title是否为数据
  77. Cell cell = row.getCell(0);
  78. switch (cell.getCellTypeEnum()){//.getCellType()) {
  79. case NUMERIC:
  80. case FORMULA: {
  81. // 判断当前的cell是否为Date
  82. if (DateUtil.isCellDateFormatted(cell)) {
  83. titleflag = false;
  84. } else {// 如果是纯数字
  85. titleflag = true;
  86. }
  87. break;
  88. }
  89. case STRING:// 如果当前Cell的Type为STRING
  90. titleflag = false;
  91. break;
  92. default:// 默认的Cell值
  93. titleflag = false;
  94. }
  95.  
  96. return title;
  97. }
  98.  
  99. /**
  100. * 读取Excel数据内容
  101. */
  102. public Map<Integer, Map<Integer, Object>> readExcelContent() throws Exception {
  103. if (wb == null) {
  104. throw new Exception("Workbook对象为空!");
  105. }
  106. Map<Integer, Map<Integer, Object>> content = new HashMap<Integer, Map<Integer, Object>>();
  107.  
  108. sheet = wb.getSheetAt(0);
  109. // 得到总行数
  110. int rowNum = sheet.getLastRowNum();
  111. row = sheet.getRow(0);
  112. int colNum = row.getPhysicalNumberOfCells();
  113. // 正文内容应该从第二行开始,第一行为表头的标题
  114. for (int i = 1; i <= rowNum; i++) {
  115. row = sheet.getRow(i);
  116. int j = 0;
  117. Map<Integer, Object> cellValue = new HashMap<Integer, Object>();
  118. while (j < colNum) {
  119. Object obj = getCellFormatValue(row.getCell(j));
  120. cellValue.put(j, obj);
  121. j++;
  122. }
  123. content.put(i, cellValue);
  124. }
  125. return content;
  126. }
  127.  
  128. /**
  129. * 根据Cell类型设置数据
  130. */
  131. private Object getCellFormatValue(Cell cell) {
  132. Object cellvalue = "";
  133. if (cell != null) {
  134. // 判断当前Cell的Type
  135. switch (cell.getCellTypeEnum()){//.getCellType()) {
  136. case NUMERIC:
  137. case FORMULA: {
  138. // 判断当前的cell是否为Date
  139. if (DateUtil.isCellDateFormatted(cell)) {
  140. // 如果是Date类型则,转化为Data格式
  141. // data格式是带时分秒的:2013-7-10 0:00:00
  142. // cellvalue = cell.getDateCellValue().toLocaleString();
  143. // data格式是不带带时分秒的:2013-7-10
  144. Date date = cell.getDateCellValue();
  145. cellvalue = date;
  146. } else {// 如果是纯数字
  147.  
  148. // 取得当前Cell的数值
  149. cellvalue = String.valueOf((int)cell.getNumericCellValue());
  150. }
  151. break;
  152. }
  153. case STRING:// 如果当前Cell的Type为STRING
  154. // 取得当前的Cell字符串
  155. cellvalue = "\""+cell.getRichStringCellValue().getString()+"\"";
  156. //字符串加上双引号"",否则导入数据时会出错
  157. break;
  158. default:// 默认的Cell值
  159. cellvalue = "";
  160. }
  161. } else {
  162. cellvalue = "";
  163. }
  164. return cellvalue;
  165. }
  166.  
  167. public static void main(String[] args) {
  168. try {
  169. //connection
  170. Class.forName("com.mysql.jdbc.Driver");
  171. String url = "jdbc:mysql://localhost:3306/wmj?&useSSL=false"; //设置url,wmj是database
  172. Connection conn;//创建连接
  173. conn = (Connection)DriverManager.getConnection(url, "root", "root123");//username="root",password = "root123"
  174. Statement stmt = conn.createStatement();
  175.  
  176. filepathlist = Util.fileList("D:\\lzu\\数据预处理\\Data", ".xls,.xlsx");//导入数据文件夹和数据文件类型
  177.  
  178. for(String filepath : filepathlist) {
  179. //插入数据前
  180. String t = "";
  181. String sql = "select count(*) from tbl_data_bak";
  182. ResultSet ret = stmt.executeQuery(sql);
  183. if(ret.next()) {
  184. System.out.print("count="+ret.getInt(1));
  185. }
  186.  
  187. ImportDataFromExcelToMysql excelReader = new ImportDataFromExcelToMysql(filepath);
  188. // 对读取Excel表格标题测试
  189. String[] title = excelReader.readExcelTitle();
  190. //System.out.println("获得Excel表格的标题:");
  191. for (String s : title) {
  192. //System.out.print(s + "| ");
  193. t += s + ",";
  194. }
  195. t = t.substring(0,t.length()-1);
  196. //System.out.println("title = " + t);
  197.  
  198. // 如果标题是数据,则插入
  199. if(titleflag) {
  200. sql = "insert into tbl_data_bak values(" + t + ");";
  201. stmt.executeUpdate(sql);
  202. }
  203.  
  204. // 插入数据后
  205. sql = "select count(*) from tbl_data_bak";
  206. ret = stmt.executeQuery(sql);
  207. if(ret.next()) {
  208. System.out.print("count="+ret.getInt(1));
  209. }
  210.  
  211. // 对读取Excel表格内容测试
  212. Map<Integer, Map<Integer, Object>> map = excelReader.readExcelContent();
  213. //System.out.println("获得Excel表格的内容:");
  214. for (int i = 1; i <= map.size(); i++) {
  215. //System.out.println(map.get(i));
  216. sql = map.get(i).values().toString().substring(1,map.get(i).values().toString().length()-1);
  217. //System.out.println("sql=" + sql);
  218. stmt.executeUpdate("insert into tbl_data_bak values("+sql+");");
  219. }
  220.  
  221. // 插入数据后
  222. sql = "select count(*) from tbl_data_bak";
  223. ret = stmt.executeQuery(sql);
  224. if(ret.next()) {
  225. System.out.print("count="+ret.getInt(1));
  226. }
  227. }
  228. stmt.close();
  229. conn.close();
  230. }
  231. /*catch(SQLException e) {
  232. e.printStackTrace();
  233. }*/
  234. catch (FileNotFoundException e) {
  235. System.out.println("未找到指定路径的文件!");
  236. e.printStackTrace();
  237. } catch (Exception e) {
  238. e.printStackTrace();
  239. }
  240. }
  241. }

最后。

写这个东西之前,我没有接触过Java,用了以后才发现Java也蛮好用的,所以自己又学了学。发现想学好还是很难的,东西很多。上学期我还学了点Python,然而都是皮毛而已。真是接触的越多,发现自己会的越少。加油吧。

用JDBC把Excel中的数据导入到Mysql数据库中的更多相关文章

  1. 用ttBulkCp把excel中的数据导入到timesten数据库中

    最近要做数据预处理,需要用到数据库.而且是以前从来没听说过的TimesTen. 首要目标是要把Excel里的数据,导入到TimesTen数据库中.而TimesTen在win10里用不了,于是我就在虚拟 ...

  2. c#.net Excel中的数据导入到SQL数据库中

    /// <summary>        /// 从Excel 导入学生        /// </summary>        /// <param name=&qu ...

  3. 如何用java POI将word中的内容导入到mysql数据库中

    由于作业需要,要求我们将word文档中的数据直接导入到mysql中,在网上找了很常时间,终于将其解决. 由于比较初级,所以处理的word文档是那种比较规范的那种,条例比较清晰,设计的思路也比较简单,就 ...

  4. Oracle中的数据迁移到Mysql数据库中的方式Navicat premium工具

    1.安装 Navicat premium工具 2.破解 Navicat premium工具 3.连接需要相互迁移的两个库Mysql和Oracle(可以是远程的或者本机的数据库都是可以的) 4.连接上之 ...

  5. 把excel中的数据导入到Oracle数据库中

    从事工作以来,数据库一直使用oracle,却不知道excel导入oracle,今天看了一篇文章,分享给大家,希望对大家有用. https://jingyan.baidu.com/article/0f5 ...

  6. 如何将MongoDB数据库的数据迁移到MySQL数据库中

    FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...

  7. 怎样把excel的数据导入到sqlserver2000数据库中

    在做程序的时候有时需要把excel数据导入到sqlserver2000中,以前没从外部导入过数据,今天刚做了一下导入数据,感觉还是蛮简单的,没做过之前还想着多么的复杂呢,下面就来分享一下我是如何把ex ...

  8. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  9. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...

随机推荐

  1. IIS中报错弹出调试,系统日志-错误应用程序名称: w3wp.exe,版本: 8.5.9600.16384,时间戳: 0x5215df96(360主机卫士)

    偶遇一次特殊情况,在使用Web系统导入数据模版(excel)时,服务端IIS会报错并弹出调试框,然后整个网站都处于卡死的debug状态,如果点否不进行调试,则IIS会中断调试,Web系统继续执行,运行 ...

  2. 【opencv实践】边缘检测

    边缘检测: 一.canny算子 Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子,也就是Canny算子.类似与 LoG 边缘检测方法,也属于先平滑后求导数的方法. 二.canny算 ...

  3. rem是怎么计算的(转载)

    「rem」是指根元素(root element,html)的字体大小,从遥远的 IE6 到版本到 Chrome 他们都约好了,根元素默认的 font-size 都是 16px. rem是通过根元素进行 ...

  4. windows 双网卡同时上专网(内网)和外网

    本操作是用网线做专网(内网),无线网卡用于外网 1. 记录有线网卡的网络的网关,例如10.103.14.1 2. 有线网卡必须是手动指定的ip地址,把网关清掉,例如 3. 删除0.0.0.0 路由 r ...

  5. mysql 5.7~默认sql_mode解读

    当5.6升级到5.7时,首先要注意的就是sql_mode对业务的影响 大概可以分为几类1 共同支持,如果你的5.6和5.7sql_mode配置支持的交集一样,那么不用考虑2 5.7细说  1 ONLY ...

  6. 风火轮SMC532使用

    2018年3月份申请了一个院创,要做一个基于NFC技术的考勤设备,想法是用手机的NFC将学号信息传导考勤机,由考勤机统计缺勤信息,因为自己的拖延症,一直拖到现在.现在一边写毕业论文一边准备院创答辩,又 ...

  7. dba_segements 没有所有的表的信息

    这是oracle11g新增的功能,假设一个一般的用户user新建了一张表user_table,这时切换到sys用户查看dba_segments 查看user_table的信息,发现dba_segmen ...

  8. 爬虫 http原理,梨视频,github登陆实例,requests请求参数小总结

    回顾:http协议基于请求响应的方式,请求:请求首行 请求头{'keys':vales} 请求体 :响应:响应首行,响应头{'keys':'vales'},响应体. import socket soc ...

  9. cocos creator 碰撞检测

    creator的碰撞检测系统分为碰撞检测系统和物理碰撞检测系统两个模块,并且这两个模块是相互独立的(这边主要是非物理碰撞检测系统) 1.在制作碰撞检测系统的时候要对物体进行分组,即指定节点的分组与分组 ...

  10. 操作Excel

    1.成面积计算(比如一块区域的数据统一除1000) (1).选一个空格单元格输入公式 回车 (2).复制改单元格 >选中所有要计算的面积 >右键 >选择性粘贴 >选择数值 &g ...