日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java excel data 导入数据_java实现导入导出excel数据

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java excel data 导入数据_java实现导入导出excel数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目需要,要實現一個導入導出excel的功能,于是,任務驅動著我學習到了POI和JXL這2個java操作Excel的插件。

一、POI和JXL介紹

1、POI:是對所有office資源進行讀寫的一套工具包、屬于apache開源組織。

poi操作excel:

poi是把整個文件的屬性都封裝在HSSFWorkbook 中;

通過HSSFWorkbook來操作單個工作薄。然后通過工作薄來操作行;

在通過行來操控單元格。這樣一級一級的分拆下來;

HSSFWorkbook---->HSSFSheet----->HSSFRow---->HSSFCell;

由于是基于HSSFWorkbook對象一步步創建起來的。所以不用把創建好的單元格添加進這個對象中、

如果需要對部分表格進行設置樣式什么的。就可以創立HSSFCellStyle對象來進行設定樣式;

2、JXL:只能對excel進行操作的一套工具包。

jxl是把整個文件封裝在Workbook相關對象中;

通過Workbook去創建sheet工作薄;但是和poi不一樣的地方是

jxl是通過向sheet中使用label(單元格)來進行讀取寫入;

Workbook----->sheet------>label ;

jxl是先創建一個工作區域、然后區創立單元格、單元格包含這個單元格的位置、內容等信息;然后把這個單元格加入工作區;

二、實例操作

1、用POI方式實現導出數據到excel功能

實現思路:當一點擊導出按鈕就跳轉到指定的action去執行對應方法,先調用dao對數據庫數據進行查詢,根據dao層的方法返回一個集合對象,然后把這個集合對象的數據交互給POI去動態生成單元格并設置進去。項目后端我用的是ssh框架搭建項目,所以邏輯代碼我寫在action類中。直接看以下代碼示例

前端jsp頁面按鈕部分

??導出

交換生實體類

package com.international.model;

import java.util.Date;

import cn.afterturn.easypoi.excel.annotation.Excel;

import cn.afterturn.easypoi.excel.annotation.ExcelTarget;

public class ExchangeStudent {

//此表按照單表來操作,只用作記錄

private int id;

private String studentNo;

private String studentName;

private String sex;

private String major;

private String className;

private Date startTime;

private Date endTime;

private String exchangeCollege;

private String reserves1;

private String reserves2;

private String reserves3;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getStudentNo() {

return studentNo;

}

public void setStudentNo(String studentNo) {

this.studentNo = studentNo;

}

public String getStudentName() {

return studentName;

}

public void setStudentName(String studentName) {

this.studentName = studentName;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getMajor() {

return major;

}

public void setMajor(String major) {

this.major = major;

}

public String getClassName() {

return className;

}

public void setClassName(String className) {

this.className = className;

}

public Date getStartTime() {

return startTime;

}

public void setStartTime(Date startTime) {

this.startTime = startTime;

}

public Date getEndTime() {

return endTime;

}

public void setEndTime(Date endTime) {

this.endTime = endTime;

}

public String getExchangeCollege() {

return exchangeCollege;

}

public void setExchangeCollege(String exchangeCollege) {

this.exchangeCollege = exchangeCollege;

}

public String getReserves1() {

return reserves1;

}

public void setReserves1(String reserves1) {

this.reserves1 = reserves1;

}

public String getReserves2() {

return reserves2;

}

public void setReserves2(String reserves2) {

this.reserves2 = reserves2;

}

public String getReserves3() {

return reserves3;

}

public void setReserves3(String reserves3) {

this.reserves3 = reserves3;

}

}

后端action類內的業務方法代碼

//導出交換生

public String exportExchangeSudent() throws Exception{

//獲取交換生對象

List studentList = esd.queryInterStudents("");

String []tableHeader={"學號","姓名","性別","班級","專業","交換開始時間","交換結束時間","交換的院校"};

short cellNumber=(short)tableHeader.length;//表的列數

workbook = new HSSFWorkbook(); //創建一個Excel

style = workbook.createCellStyle(); //設置表頭的類型

style.setAlignment(HorizontalAlignment.CENTER);

style1 = workbook.createCellStyle(); //設置數據類型

style1.setAlignment(HorizontalAlignment.CENTER);

HSSFFont font = workbook.createFont(); //設置字體

HSSFSheet sheet = workbook.createSheet("sheet1"); //創建一個sheet

HSSFHeader header = sheet.getHeader();//設置sheet的頭

try {

//根據是否取出數據,設置header信息

if(studentList.size() < 1 ){

header.setCenter("查無資料");

}else{

header.setCenter("交換生表");

row = sheet.createRow(0);

row.setHeight((short)400);

//表頭

for(int k = 0;k < cellNumber;k++){

cell = row.createCell((short) k);//創建第0行第k列

cell.setCellValue(tableHeader[k]);//設置第0行第k列的值

sheet.setColumnWidth((short)k,(short)8000);//設置列的寬度

font.setColor(HSSFFont.COLOR_NORMAL); // 設置單元格字體的顏色.

font.setFontHeight((short)350); //設置單元字體高度

style1.setFont(font);//設置字體風格

cell.setCellStyle(style1);

}

// 給Excel填充數據

for(int i = 0 ;i < studentList.size() ;i++){

//獲取InternationalStudent對象

ExchangeStudent student1 = (ExchangeStudent)studentList.get(i);

row = sheet.createRow((short) (i + 1));//創建第i+1行

row.setHeight((short)400);//設置行高

if(student1.getStudentNo() != null){

cell = row.createCell((short) 0);//創建第i+1行第0列

cell.setCellValue(student1.getStudentNo());//設置第i+1行第0列的值

cell.setCellStyle(style);//設置風格

}

if(student1.getStudentName() != null){

cell = row.createCell((short) 1); //創建第i+1行第1列

cell.setCellValue(student1.getStudentName());//設置第i+1行第1列的值

cell.setCellStyle(style); //設置風格

}

if(student1.getSex() != null){

cell = row.createCell((short) 2);

cell.setCellValue(student1.getSex());

cell.setCellStyle(style);

}

if(student1.getClassName()!= null){

cell = row.createCell((short) 3);

cell.setCellValue(student1.getClassName());

cell.setCellStyle(style);

}

if(student1.getMajor()!= null){

cell = row.createCell((short) 4);

cell.setCellValue(student1.getMajor());

cell.setCellStyle(style);

}

if(student1.getStartTime() != null){

cell = row.createCell((short) 5);

cell.setCellValue(student1.getStartTime().toString().substring(0,10));

cell.setCellStyle(style);

}

if(student1.getEndTime() != null){

cell = row.createCell((short) 6);

cell.setCellValue(student1.getEndTime().toString().substring(0,10));

cell.setCellStyle(style);

}

if(student1.getExchangeCollege() != null){

cell = row.createCell((short) 7);

cell.setCellValue(student1.getExchangeCollege());

cell.setCellStyle(style);

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

outputSetting("交換生表.xls");

return null;

}

//固定配置

public void outputSetting(String fileName) {

HttpServletResponse response = null;//創建一個HttpServletResponse對象

OutputStream out = null;//創建一個輸出流對象

try {

response = ServletActionContext.getResponse();//初始化HttpServletResponse對象

out = response.getOutputStream();// 得到輸出流

response.setHeader("Content-disposition","attachment; filename="+new String(fileName.getBytes(),"ISO-8859-1"));//filename是下載的xls的名

response.setContentType("application/msexcel;charset=UTF-8");//設置類型

response.setHeader("Pragma","No-cache");//設置頭

response.setHeader("Cache-Control","no-cache");//設置頭

response.setDateHeader("Expires", 0);//設置日期頭

workbook.write(out);

out.flush();

workbook.write(out);

} catch (IOException e) {

e.printStackTrace();

}finally{

try{

if(out!=null){

out.close();

}

}catch(IOException e){

e.printStackTrace();

}

}

}

一些關于ssh框架的配置代碼

//struts.xml文件

//applicationContext-actions.xml

編寫完以上代碼,通過poi方式導出excel數據就實現了,主要關注action類那部分代碼。

2、用JXL方式實現導入excel數據功能

實現思路:前端界面按下導入按鈕,彈出個模態框,提示選擇導入excel文件,其實導入功能是先上傳文件到服務器指定路徑,然后通過JXL去讀取上傳的excel數據,然后裝進集合對象里,最后再循環的把集合對象里的數據遍歷插入到數據庫中,相當于遍歷調用添加交換生的方法。直接看下面貼出來的代碼。

前端jsp頁面關鍵代碼,有用到bootstrap框架

×

導入交換生EXCEL表

導入前請先下載交換生Excel表模板,按規范導入

關閉

提交

js代碼實現跳轉action

//導入excel文件

function importExcel(){

var formData = new FormData($("#studentExcel")[0]); // 要求使用的html對象

//console.log(formData);

$.ajax(

{

type:"post",

url:"http://localhost:8080/InternationalSys/background/importExcelAction!importExStudentExcel",

//注:如果沒有文件,只是簡單的表單數據則可以使用 $('#formid').serialize();

data:formData,

dataType:"json",

async:false,

contentType: false,

processData: false,

success: function(data){

if(data!=null && data!=""){

alert(data);

}

}

}

);

}

后端action類內的邏輯方法代碼

package com.international.common;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import org.apache.commons.io.FileUtils;

import org.apache.commons.lang.StringUtils;

import jxl.*;

import org.apache.struts2.ServletActionContext;

import com.international.dao.ExchangeStuDao;

import com.international.model.ExchangeStudent;

import com.opensymphony.xwork2.ActionSupport;

import jxl.read.biff.BiffException;

import jxl.write.DateTime;

public class ImportExcelAction extends ActionSupport{

private String uploadFileName;

private File upload;

private String savePath;

private List exStudentList = new ArrayList();

private ExchangeStuDao esd;

public ExchangeStuDao getEsd() {

return esd;

}

public void setEsd(ExchangeStuDao esd) {

this.esd = esd;

}

public String getUploadFileName() {

return uploadFileName;

}

public void setUploadFileName(String uploadFileName) {

this.uploadFileName = uploadFileName;

}

public File getUpload() {

return upload;

}

public void setUpload(File upload) {

this.upload = upload;

}

public String getSavePath() {

return savePath;

}

public void setSavePath(String savePath) {

this.savePath = savePath;

}

public List getExStudentList() {

return exStudentList;

}

public void setExStudentList(List exStudentList) {

this.exStudentList = exStudentList;

}

//導入excel數據到交換生表

@SuppressWarnings("static-access")

public void importExStudentExcel() throws IOException{

System.out.println("excel的值為:"+ uploadFileName);

String message="";

String path=null;

Workbook book = null; //jxl工作簿

InputStream fileIn = null;

if(uploadFileName!=null && !uploadFileName.equals("")){

//攔截僅允許上傳文件類型

if(uploadFileName.substring(uploadFileName.lastIndexOf(".")).equals(".xls")) {

//獲取需要上傳文件的文件路徑

path=ServletActionContext.getServletContext().getRealPath(this.getSavePath()+ "\\" +this.uploadFileName);

System.out.println("上傳Excel的路徑:"+path);

//判斷文件是否上傳,如果上傳的話將會創建該目錄

File target= new File(path); // 定義目標文件對象

try {

FileUtils.copyFile(upload, target);

} catch (Exception e) {

e.printStackTrace();

}

// 刪除臨時文件

upload.delete();

int sum=0;//計算導入成功的條數

try {

System.out.println("上傳路徑:"+path);

fileIn = new FileInputStream(path);

//根據指定的文件輸入流導入Excel從而產生Workbook對象

System.out.println("輸入流:"+fileIn);

//獲取Excel對象

try {

book = book.getWorkbook(new File(path));

} catch (BiffException e1) {

// TODO 自動生成的 catch 塊

e1.printStackTrace();

}

//獲取Excel的第一個sheet表

Sheet sheet = (Sheet) book.getSheet(0);

System.out.println("獲取到的Excel數據:"+ sheet);

System.out.println("行數:"+sheet.getRows());

System.out.println("列數:"+sheet.getColumns());

//對Sheet中的每一行進行迭代

for (int i = 1; i < sheet.getRows(); i++) {

//創建實體類

ExchangeStudent exStudent = new ExchangeStudent();

// 獲取第一列第二行單元格對象

exStudent.setStudentNo(sheet.getCell(0, i).getContents());

exStudent.setStudentName(sheet.getCell(1, i).getContents());

exStudent.setSex(sheet.getCell(2, i).getContents());

exStudent.setClassName(sheet.getCell(3, i).getContents());

exStudent.setMajor(sheet.getCell(4, i).getContents());

Date sTime = null;

//日期格式處理方式:

if(sheet.getCell(5, i).getType() == CellType.DATE){

DateCell dc = (DateCell)sheet.getCell(5, i);

sTime = dc.getDate(); //獲取單元格的date類型

}

exStudent.setStartTime(sTime);

Date eTime = null;

//日期格式處理方式:

if(sheet.getCell(6, i).getType() == CellType.DATE){

DateCell dc = (DateCell)sheet.getCell(6, i);

eTime = dc.getDate(); //獲取單元格的date類型

}

exStudent.setEndTime(eTime);

exStudent.setExchangeCollege(sheet.getCell(7, i).getContents());

//不是空對象才加入集合中

if(exStudent!=null) {

exStudentList.add(exStudent);

}

}

System.out.println(exStudentList);

for(int i=0; i

if(!esd.queryStudentNo(exStudentList.get(i).getStudentNo())) {

if(esd.addExStudent(exStudentList.get(i))){

sum++;

}

}else {

message = "此條學生記錄已存在";

System.out.println("此條學生記錄已存在");

continue;

}

}

System.out.println("導入的學生人數:"+sum);

if(sum>0){

System.out.println("導入成功");

message="導入成功";

}else{

System.out.println("導入失敗");

message="導入失敗";

}

fileIn.close();

} catch (IOException ex) {

ex.printStackTrace();

}

}else {

System.out.println("上傳的只能是后綴為.xls的Excel文件");

message = "上傳的只能是后綴為.xls的Excel文件";

}

}else{

message="請先上傳交換生信息的Excel文件";

System.out.println("請先上傳交換生信息的Excel文件");

}

ajaxAction.toJson(ServletActionContext.getResponse(),message);

}

}

dao層的代碼

//根據學號查詢數據庫是否有這個交換生

public boolean queryStudentNo(String stuNo) {

Session session = null;

try {

session = sessionFactory.openSession();

String hql = "from ExchangeStudent where studentNo="+stuNo;

Query query = session.createQuery(hql);

List list = query.list();

if(list.size()>0) {

return true;

}else {

return false;

}

}catch (Exception e) {

e.printStackTrace();

return false;

}finally {

session.close();

}

}

//添加交換生信息

public boolean addExStudent(ExchangeStudent exchangeStudent) {

Session session = null;

try{

session = sessionFactory.openSession();

Transaction tran = session.beginTransaction();

session.save(exchangeStudent);

tran.commit();

return true;

}catch(Exception e){

e.printStackTrace();

return false;

}finally{

session.close();

}

}

一些ssh的配置文件

//applicationContext-actions.xml

//struts.xml

/upload

根據以上的代碼,通過jxl方法的導入功能也實現了,主要關注action類的那部分代碼。

圖片.png

三、期間遭遇問題(PS:我認為這才是我寫這篇文章的初心和這篇文章的重點,差不多的功能對于每個人都可能出現許多不同的問題,我們要學會自己解決問題,我把這分享出來。)

注意:以上導入導出的實例代碼要成功,都得基于導入相應的POI和JXL的jar包,否則是空談。

2、報錯:Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 違反了 UNIQUE KEY 約束“UQ__Exchange__4D119D59097C43E3”。不能在對象“dbo.ExchangeStudent”中插入重復鍵。重復鍵值為 ()。

問題原因:因為我數據庫表中studentNo這個字段設置了唯一性約束,所以當excel插入的時候,數據庫里面已經存在了該條記錄,所以不讓插入。

解決方案:我在dao層里加入一個方法,就是上面的queryByStudentNo()方法,用來根據excel表里的學號數據去數據庫查詢有無這個學生,有的話就不插入了,繼續下一次循環。

3、導入excel表中的日期數據報錯:java.text.ParseException: Unparseable date: "" 解決參考這里

//思路是借用下面這一段的,我自己寫的在上面實例代碼。

DateTime accessTime = null;

//日期格式處理方式:

if(sheet.getCell(2, j).getType() == CellType.DATE){

DateCell dc = (DateCell)sheet.getCell(2, j);

Date date = dc.getDate(); //獲取單元格的date類型

accessTime = new DateTime(date);

}

4、JXL讀取Excel文件,調用sheet.getRows()竟然返回多余的行數。這個有點玄學,明明excel數據有3行數據而已,在程序獲取的時候竟然顯示有33行數據,最后還是莫名其妙的就恢復正常了。

5、報錯:jxl讀取excel文件異常,Unable to recognize OLE stream。這是jxl導入excel數據只支持后綴為.xls文件的問題。解決方案這里

6、ssh上傳文件到服務器隔一會文件會自動刪除。解決方案這里

7、導入時遇到多表關聯的數據,比如我在導入國際班學生的excel數據時,excel表里有班級的字段,報錯:org.hibernate.TransientObjectException: object references an unsaved tran。經排查,問題代碼鎖定在下圖這塊。

圖片.png參考了這篇文章,雖然不報錯了,導入成功,但是并沒有真正解決我的需求,因為這篇文章是級聯保存主從表,即主表和從表都插入了數據,但我的需求是數據庫里國際班學生表關聯班級表,在批量插入國際班學生的信息時班級表不能保存,于是我這又真不知怎么辦了,但我要讓蒼天知道我不認輸,一點點思考排查。。。慢慢地,我逐漸了解到事情的本質,我這段代碼問題出在我是新創建了一個班級對象,所以剛開始導入國際班學生信息時才會提示班級主表的信息沒保存,于是我想到,那我不新創建班級對象,我直接去數據庫里查這個班級對象,在設值進去國際班學生對象的屬性里不就搞定了!最后代碼就變成了這樣,問題解決。

圖片.png

總結:這2功能我花了2天時間,第一次接觸,期間遇到各種詭異問題,現在總算是實現了,代碼路上,不放棄才能熬到最后。

四、參考文章

總結

以上是生活随笔為你收集整理的java excel data 导入数据_java实现导入导出excel数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。