1. 程式人生 > >Java模組 -- 讀取Excel檔案寫入資料庫 Mybatis , POI , JXL

Java模組 -- 讀取Excel檔案寫入資料庫 Mybatis , POI , JXL

廢話不多說,直接上程式碼結構圖


所用到的lib包


Students 實體類

package com.test.model;

public class Students {
	private int id;
	private String username;
	private int age;
	private int salary;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Students [id=" + id + ", username=" + username + ", age=" + age
				+ ", salary=" + salary + "]";
	}
	public Students(int id, String username, int age, int salary) {
//		super();
		this.id = id;
		this.username = username;
		this.age = age;
		this.salary = salary;
	}
	public Students() {
//		super();
	}	
}

Mybatis 配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<!-- 配置資料庫連線資訊 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/testmysql"/>
				<property name="username" value="root"/>
				<property name="password" value="1234"/>
			</dataSource>
		</environment>
	</environments>

	<!-- sql語句的配置檔案 -->
	<mappers>
		<mapper resource="com/test/reader/sqlconfig/students.xml"/>
	</mappers>

</configuration>

Students.xml  sql語句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.test.readerExcel.TestReaderExcelToDB">

	<select id="getStudent" resultType="map">
		select * from students order by id
	</select>

	<select id="getStudentById" resultType="map" parameterType="map">
		select * from students where id = #{userId}
	</select>
	
	<delete id="deleteStuentById" parameterType="map">
		delete from students where id = #{userId}
	</delete>
	
	<insert id="insertStudent" parameterType="map">
		insert into students 
			(username,age,salary)
		values
			(
				#{username},
				#{age},
				#{salary}
			)
	</insert>
</mapper>
SqlSessionUtil
package com.test.util;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionUtil {

	public SqlSession getSqlSession() {
		
		String configFile = "mybatis_Config.xml";
		// 使用類載入器 載入mybatis的配置檔案,mybatis配置檔案中配置了關聯對映檔案
		InputStream inputStream = SqlSessionUtil.class.getClassLoader().getResourceAsStream(configFile);
		// 構建sqlSession工廠
		SqlSessionFactory sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession sqlSession = sqlsessionFactory.openSession();
		return sqlSession;
		
	}
}

讀取Excel的工具類

這個讀取Excel2007 的程式碼有點問題,不知道是方法問題,還是我程式碼問題,總是最後少一行,昨天找了半天沒找到....真是吐血....

ReaderExcelUtils

package com.excelutils;

import java.io.File;
import java.io.FileInputStream;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import jxl.Sheet;
import jxl.Workbook;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


/**
 * 讀取Excel
 * @author CYX
 * @since 2016-6-4 上午1:03:23
 */
public class ReaderExcelUtils {
	
	/**
	 * 輸入Excel檔案,解析後返回ArrayList
	 * 
	 * @param file
	 * 			輸入的Excel檔案
	 * 
	 * @return ArrayList<Map>,其中的map以第一行的內容為鍵值
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static ArrayList<Map> ReaderExcel(File file){		
		
		/*
		 * workbook : 工作簿,就是整個Excel文件
		 * sheet : 工作表
		 * cell : 一個單元格
		 * row : 一行
		 */
		
		if(checkExcel2007(file)){
			return importToExcel2007(file);
		}
		
		//初始化返回值和欄位名陣列
		ArrayList<Map> arr = new ArrayList<Map>();
		String[] title;
		Workbook workbook = null;
		
		try{
			//讀取Excel檔案
			workbook = Workbook.getWorkbook(file);
			//總Sheet數
			int sheetNumber = workbook.getNumberOfSheets();
			System.out.println("Sheet總數: "+sheetNumber);
			for (int i = 0; i < sheetNumber; i++) {
				Sheet sheet = workbook.getSheet(i);
				
				//當前頁 總記錄行數和列數
				int rowCount = sheet.getRows();			//獲取行數
				int columeCount = sheet.getColumns();	//獲取列數
				System.out.println("總記錄數 : "+rowCount);
				System.out.println("總列數 : "+columeCount);
				
				//第一行為欄位名,所以行數大於一才執行
				if(rowCount > 1 && columeCount >0){
					//取第一列 為 欄位名
					title = new String[columeCount];
					for (int j = 0; j < columeCount; j++) {
						title[j] = sheet.getCell(j,0).getContents().trim();
					}
					
					//取當前頁所有值放入list中
					for (int h = 1; h < rowCount; h++) {	//行數
						LinkedHashMap dataMap = new LinkedHashMap();
						for (int k = 0; k < columeCount; k++) {	//列數
							dataMap.put(title[k], sheet.getCell(k,h).getContents());	//getContents() 獲取單元格的值
						}
						arr.add(dataMap);
					}
				}							
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(workbook != null){
				workbook.close();
				workbook = null;
			}
		}		
		return arr;
	}

	
	/**
	 * 輸入2007版以上excel檔案,解析後返回ArrayList(有個bug,暫時不用,保留)
	 * @param file
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static ArrayList<Map> importToExcel2007(File file){
		ArrayList<Map> arr = new ArrayList<Map>();
		String[] title;
		
		//初始化
		FileInputStream readFile = null;
		XSSFWorkbook workbook = null;
		XSSFRow row = null;
		XSSFSheet sheet = null;
		XSSFCell cell = null;
		
		try{			
			//讀取檔案
			readFile = new FileInputStream(file);
			workbook = new XSSFWorkbook(readFile);
			
			//文件頁數
			int numOfSheets = workbook.getNumberOfSheets();
			System.out.println("文件頁數 : "+numOfSheets);
			
			for (int i = 0; i < numOfSheets; i++) {				
				//獲取當前的sheet(工作表)
				sheet = workbook.getSheetAt(i);
				//獲取當前頁的行數
				int sheetRows = sheet.getLastRowNum();				
				System.out.println("當前頁總行數 : "+sheetRows);
				//如果當前頁行數大於0,則先取第一行為欄位名
				if(sheetRows > 0){
					row = sheet.getRow(0);	//當前頁 第一行
					int cells = row.getLastCellNum();	//第一行 單元格數量
					title = new String[cells];
					for (int j = 0; j < cells; j++) {
						//列為空,則輸入空字串
						if(row.getCell(j) == null){
							title[j] = "";
							continue;
						}
						cell = row.getCell(j);
						switch (cell.getCellType()) {
							case Cell.CELL_TYPE_NUMERIC:{
								Integer num = new Integer((int) cell.getNumericCellValue());
								title[j] = String.valueOf(num);
								break;
							}
							case Cell.CELL_TYPE_STRING:{
								title[j] = cell.getRichStringCellValue().toString();
								break;
							}
							default:
								title[j] = "";
						}
					}					
					//分行解析
					for (int j = 0; j < sheetRows; j++) {
						//如果是空行,則繼續下一條
						if(sheet.getRow(j) == null){
							continue;
						}
						//將每行資料放入map中
						row = sheet.getRow(j);
						arr.add(getCellMap(row,cells,title));
					}					
				}
			}							
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				readFile.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return arr;
	}
	
	/**
	 * 根據副檔名判斷是否是Excel 2007 以上
	 * @param file
	 * @return
	 */
	private static boolean checkExcel2007(File file){
		String extendName = file.getName().substring(file.getName().lastIndexOf("."));
		if(extendName.equals(".xlsx")){
			return true;
		}
		return false;
	}
	
	
	/**
	 *	根據傳入的Excel行資料,得到Map資料 
	 * @param row
	 * @param cells
	 * @param title
	 * @return
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private static Map getCellMap(XSSFRow row , int cells , String[] title){
		//初始化
		Map data = new HashMap();
		XSSFCell cell = null;
		
		//分列
		for (int i = 0; i < cells; i++) {
			//列為空,則輸入空字串
			if(row.getCell(i) == null){
				data.put(title[i], "");
				continue;
			}
			cell = row.getCell(i);
			switch (cell.getCellType()) {
				case Cell.CELL_TYPE_NUMERIC:{
					if(DateUtil.isCellDateFormatted(cell)){
						data.put(title[i], cell.getDateCellValue());
					}else{
						NumberFormat nf = NumberFormat.getInstance();
						nf.setGroupingUsed(false);
						data.put(title[i], nf.format(cell.getNumericCellValue()));
					}
					break;
				}
				case Cell.CELL_TYPE_STRING:{
					data.put(title[i], cell.getRichStringCellValue());
					break;
				}
				case Cell.CELL_TYPE_BOOLEAN:{
					data.put(title[i], cell.getBooleanCellValue());
					break;
				}
				default:
					data.put(title[i], "");
			}
		}			
		return data;
	}
}


Java Bean的一些方法 很好用....多看看專案程式碼...
package com.beanutils;

import java.util.Map;

/**
 * JavaBean 工具方法
 * @author CYX
 * @since 2016-6-4 上午12:16:23
 */
public class MyBeanUtils {
	
	/**
	 * 將JavaBean中的get屬性轉換到Map中
	 * 
	 * <pre>
	 * 符合拷貝條件的屬性必須滿足以下幾點:
	 * 		1.源JavaBean中具有get方法的屬性
	 * </pre>
	 * 
	 * @param bean
	 *            源物件JavaBean
	 * @return 轉換後的Map
	 * @throws Exception
	 */
	public static Map describe(Object bean)throws Exception{
		return org.apache.commons.beanutils.BeanUtils.describe(bean);
	}
	
}

測試Main方法
package com.test.readerExcel;

import java.io.File;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.ibatis.session.SqlSession;

import com.beanutils.MyBeanUtils;
import com.excelutils.ReaderExcelUtils;
import com.test.model.Students;
import com.test.util.SqlSessionUtil;

public class TestReaderExcelToDB {

	private static ReaderExcelUtils reu = new ReaderExcelUtils();
	private static SqlSessionUtil su = new SqlSessionUtil();
	private static SqlSession session = su.getSqlSession();
	private static String className = TestReaderExcelToDB.class.getName() + ".";

	public static void main(String[] args) throws Exception {
		InsertToDataBase();
	}

	/**
	 * 讀取Excel檔案,將資料存入資料庫
	 * 
	 * @param data
	 *            資料
	 * @throws Exception
	 */
	@SuppressWarnings({ "rawtypes", "static-access" })
	public static void InsertToDataBase() throws Exception {
		Date date = new Date();
		long time = date.getTime();
		String excelFileName = "D://Export Excel By MyBatis.xls";
		File file = new File(excelFileName);
		List<Map> dataListMap = reu.ReaderExcel(file);
		Iterator it = dataListMap.iterator();
		Students students = new Students();
		MyBeanUtils mu = new MyBeanUtils();

		try {
			while (it.hasNext()) {
				Map oneMap = (Map) it.next();
				students.setUsername(oneMap.get("姓名").toString());
				students.setAge(Integer.parseInt(oneMap.get("年齡").toString()));
				students.setSalary(Integer.parseInt(oneMap.get("工資").toString()));
				Map beanMap = mu.describe(students);

				int result = 0;
				try {
					result = session.insert(className + "insertStudent",beanMap);
					if(result < 1){
						System.out.println("插入資料庫錯誤");
					}
					session.commit();
				} catch (Exception e) {
					e.printStackTrace();
					session.rollback();
				}
			}
			System.out.println("全部插入資料庫");
			Date date2 = new Date();
			long time2 = date2.getTime();
			long longs = time2 - time;
			System.out.println(longs);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 獲取Map中的key值
	 * 
	 * @param dataMap
	 * @return
	 */
	public static String[] getMapKey(Map dataMap) {
		String[] keyArr = new String[dataMap.size()];
		if (dataMap.size() < 0 || dataMap == null) {
			System.out.println("Map為空");
			return null;
		}
		String keyStr = "";
		Set set = dataMap.keySet();
		for (Object name : set) {
			keyStr += name + ",";
		}
		keyStr = keyStr.substring(0, keyStr.length() - 1);
		keyArr = keyStr.split(",");
		return keyArr;
	}

}


Excel檔案內容


執行之後,資料庫就有了....


之前在公司電腦上測試,一千五百條資料的Excel 花了75秒左右...

晚上回家用自己電腦,才2,3秒....公司電腦真是渣....

手賤試了試五千條..才五秒....

哎,真是.....




相關推薦

Java模組 -- 讀取Excel檔案寫入資料庫 Mybatis , POI , JXL

廢話不多說,直接上程式碼結構圖 所用到的lib包 Students 實體類 package com.test.model; public class Students { private int id; private String username; pr

Excel檔案匯入資料庫POI+Excel+MySQL+jsp頁面匯入)第一次優化

本篇文章是根據我的上篇部落格,給出的改進版,由於時間有限,僅做了一個簡單的優化。2018年4月1日,新增下載地址連結:點選開啟原始碼下載地址十分抱歉,這個連結地址沒有在這篇文章上公佈出來。希望不是很晚。上篇文章的是這樣的一個數據流向:瀏覽器端開啟上傳頁面,選擇檔案,上傳,將e

java讀取excel檔案內容,並將讀取到的內容寫入到另一檔案

需要匯入的jar包下載地址https://pan.baidu.com/s/16cTpUfx0KvKkbGYkXAUKMA 程式碼:ReadExcel.java //信1605-3 20163432 張運濤 package domain; import java.io.File; im

java實現讀取excel或者txt檔案,匯入MongoDB資料庫

在工作中經常遇到讀取的檔案的問題,於是做了一個小總結。 1.Excel表格內容如下 2.建立main主類 public static void main(String[] args) throws Exception {       &nb

java利用poi讀取Excel檔案

java讀取Excel檔案,筆者認為:從結構上來看,Excel檔案是由一個一個的單元格組成的,有點像細胞cell,逐行的排列。那麼我們讀的時候也應該逐行逐行的讀,從左到右的尋找每一個cell。一、例項程式碼: 只是實現了一種方式,因為依照讀取內容的不同,讀取的後想要的操作不同,因此不能苟同全部,只是方法是相

Java 讀取Excel 檔案內容

在一個專案中,有一個需求,是把excel檔案的內容轉換為xml格式展示。在學習如何操作的過程中,首先是如何獲取excel檔案,其中操作的程式碼如下: 1.首先是匯入需要的 jar, 下載地址: 2.程式碼實現: package com.apusic; import org.apache.po

java讀取excel檔案內容

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

Java讀取properties檔案連線資料庫

先說為什麼要有這種東西,或者我們為什麼要用這種方式來寫,先看經常用的方法,我們經常寫的 package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQ

python 讀取excel檔案寫入json

excel內容:程式碼: import xlrd import json import operator def read_xlsx(filename): # 開啟excel檔案 data1 = xlrd.open_workbook(file

java無格式int檔案寫入讀取

今天寫一個小程式,需要將int陣列寫入檔案,然後再讀出來。為了節省空間,打算採用直接把每個int的位元組碼寫入檔案,讀的時候也是按照int的位元組碼直接進行讀取,省略了逗號、換行符等格式編碼。 第一次嘗試: FileOutputStream fOut = new File

python3 迴圈讀取excel檔案寫入json

檔案內容: excel內容: 程式碼: import xlrd import json import operator def read_xlsx(filename): # 開啟excel檔案 data1 = xlrd.open_workbo

JAVA POI上傳excel檔案資料庫並備份(上)

一、電商系統和辦公系統時常會用到Excel的匯入與匯出,在JAVA程式碼實現時,通常使用POI來處理,今天用一個demo為大家介紹POI上傳excel檔案並將資料匯入資料庫的實現過程。demo是一個jsp/servlet+maven的web專案。 二、環境:     資料庫

python讀取excel檔案並匯入mysql資料庫

import MySQLdb import xlrd import xlwt from datetime import date,datetime   database = MySQLdb.connect (host="114.116.2.203", user = "r

java讀取excel 檔案,並把讀取到的資料轉換成javabean物件

javaBean物件public class AcademicaChievements { private Integer aid; private String number; private String sname; private String award_

java使用POI讀取excel檔案,相容xls和xlsx

public List<Double> readExcels(InputStream is)throws Exception{List<Double> xlsxList = new ArrayList<Double>();    try {             if(i

java讀取excel檔案

package com.execl; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.A

解決java讀取excel檔案有小數點的問題

package com.hmy.ssh.myMethod; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import

Java讀取Excel檔案,生成SQL語句

import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import java.io.*; public class Main { public static void

利用pandas模組讀取csv檔案excel表格,並用matplotlib畫圖

# coding=utf-8 import pandas as pd # 讀取csv檔案 3列取名為 name,sex,births,後面引數格式為names= names1880 = pd.read

java 操作 poi 解析、讀取 Excel 檔案

讀取Excel 我這裡是用的POI 的jar包 dom4j-1.6.1.jar         poi-3.10.1-20140818.jar        poi-excelant-3.10.1-20140818.jar    xmlbeans-2.6.0.jar po