久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

多個sheet?Excel數據怎么導入數據庫

145次閱讀
沒有評論

共計 8780 個字符,預計需要花費 22 分鐘才能閱讀完成。

本篇內容介紹了“多個 sheet Excel 數據怎么導入數據庫”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

多個 sheet Excel 數據 導入數據庫 如何實現?

將 Excel 文件中的多個 sheet 導入數據庫,一般有以下幾種實現方式:

使用 JDBC 直接插入??梢允褂?Java 的 JDBC 接口直接連接數據庫,然后讀取 Excel 文件中的數據,并將數據插入到數據庫中。這種方式比較直接,但需要編寫大量的 JDBC 代碼,對 Excel 文件格式的支持也比較有限。

使用第三方庫。市面上有很多 Java 的第三方庫可以用來讀取 Excel 文件,如 Apache POI、JExcelAPI、EasyExcel 等。這些庫通常都提供了比較簡單易用的 API,可以方便地讀取 Excel 文件中的數據,并將數據插入到數據庫中。

先將 Excel 文件轉換成 CSV 文件,再導入數據庫。Excel 文件可以先轉換成 CSV 文件,然后使用 JDBC 直接將數據插入到數據庫中。CSV 文件相對于 Excel 文件來說,結構更加簡單,處理起來也更加方便。

無論使用哪種方式,都需要注意以下幾個問題:

Excel 文件格式的兼容性問題。不同版本的 Excel 文件可能存在格式差異,需要進行測試和兼容性處理。

數據的類型和格式問題。Excel 文件中的數據類型和格式可能需要進行轉換和處理,以適配數據庫中的數據類型和格式要求。

數據的一致性問題。如果 Excel 文件中的數據有重復或沖突,需要進行處理,以保證數據的一致性和完整性。

綜上所述,將 Excel 文件中的多個 sheet 導入數據庫的實現方式有多種,具體使用哪種方式,還需要根據實際情況進行評估和選擇。

傳統方式

處理 普通數據的 Excel 文件,需要考慮到內存和性能的問題,以下是一個基于流式讀取和寫入的示例代碼:

//  獲取  Excel  文件輸入流
InputStream is = new BufferedInputStream(new FileInputStream(filePath));
Workbook workbook = WorkbookFactory.create(is);
//  遍歷每個  Sheet
for (int sheetIndex = 0; sheetIndex   workbook.getNumberOfSheets(); sheetIndex++) { Sheet sheet = workbook.getSheetAt(sheetIndex);
 String sheetName = sheet.getSheetName();
 System.out.println(開始處理  Sheet: + sheetName);
 //  準備寫入的輸出流
 OutputStream os = new BufferedOutputStream(new FileOutputStream(outputDir +  /  + sheetName +  .xlsx));
 //  設置寫入的  Sheet  名稱
 SXSSFWorkbook writer = new SXSSFWorkbook(new XSSFWorkbook(), 10000);
 SXSSFSheet outSheet = writer.createSheet(sheetName);
 //  讀取并寫入  Sheet  的標題行
 Row titleRow = sheet.getRow(0);
 Row outTitleRow = outSheet.createRow(0);
 for (int i = 0; i   titleRow.getLastCellNum(); i++) { outTitleRow.createCell(i).setCellValue(titleRow.getCell(i).getStringCellValue());
 }
 //  逐行讀取并寫入數據
 for (int i = 1; i  = sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i);
 Row outRow = outSheet.createRow(i);
 for (int j = 0; j   row.getLastCellNum(); j++) { Cell cell = row.getCell(j);
 if (cell != null) { switch (cell.getCellType()) {
 case BLANK:
 outRow.createCell(j, CellType.BLANK);
 break;
 case BOOLEAN:
 outRow.createCell(j, CellType.BOOLEAN).setCellValue(cell.getBooleanCellValue());
 break;
 case ERROR:
 outRow.createCell(j, CellType.ERROR).setCellValue(cell.getErrorCellValue());
 break;
 case FORMULA:
 outRow.createCell(j, CellType.FORMULA).setCellFormula(cell.getCellFormula());
 break;
 case NUMERIC:
 if (DateUtil.isCellDateFormatted(cell)) { outRow.createCell(j, CellType.NUMERIC).setCellValue(cell.getDateCellValue());
 } else { outRow.createCell(j, CellType.NUMERIC).setCellValue(cell.getNumericCellValue());
 }
 break;
 case STRING:
 outRow.createCell(j, CellType.STRING).setCellValue(cell.getStringCellValue());
 break;
 default:
 outRow.createCell(j, CellType.BLANK);
 break;
 }
 }
 }
 //  每隔  10000  行進行一次緩存寫入
 if (i % 10000 == 0) { ((SXSSFSheet) outSheet).flushRows();
 }
 }
 //  最后寫入緩存的數據
 writer.write(os);
 os.flush();
 os.close();
 writer.dispose();
 System.out.println( 處理  Sheet: + sheetName +    完成 
//  關閉輸入流
is.close();

上述示例代碼使用了 Apache POI 的流式讀取和寫入方式,可以有效地處理大量數據。為了避免內存溢出,采用了緩存寫入的方式,每隔一定數量的行進行一次寫入操作。

Apache POI

使用 Apache POI 實現將 Excel 文件中的多個 sheet 導入到數據庫的 Java 代碼:

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
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;
public class ExcelImporter {
 private static final String DB_URL =  jdbc:mysql://localhost:3306/mydatabase 
 private static final String DB_USER =  myuser 
 private static final String DB_PASSWORD =  mypassword 
 private static final String INSERT_SQL =  INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?) 
 public static void main(String[] args) { try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
 FileInputStream file = new FileInputStream( myexcel.xlsx 
 Workbook workbook = new XSSFWorkbook(file);
 int numSheets = workbook.getNumberOfSheets();
 for (int i = 0; i   numSheets; i++) { Sheet sheet = workbook.getSheetAt(i);
 for (Row row : sheet) {
 String col1 = null;
 String col2 = null;
 int col3 = 0;
 for (Cell cell : row) { int columnIndex = cell.getColumnIndex();
 switch (columnIndex) {
 case 0:
 col1 = cell.getStringCellValue();
 break;
 case 1:
 col2 = cell.getStringCellValue();
 break;
 case 2:
 col3 = (int) cell.getNumericCellValue();
 break;
 default:
 // Ignore other columns
 break;
 }
 }
 PreparedStatement statement = conn.prepareStatement(INSERT_SQL);
 statement.setString(1, col1);
 statement.setString(2, col2);
 statement.setInt(3, col3);
 statement.executeUpdate();
 }
 }
 System.out.println( Import successful 
 } catch (SQLException e) { e.printStackTrace();
 } catch (Exception e) { e.printStackTrace();
 }
 }
}

在上面的代碼中,首先通過 FileInputStream 和 Workbook 對象讀取 Excel 文件中的數據,然后通過 for 循環遍歷每個 sheet 和每行數據,并將數據插入到數據庫中。在讀取單元格數據時,可以根據單元格的列索引和數據類型進行類型轉換和賦值。最后通過 PreparedStatement 執行 SQL 插入語句,將數據插入到數據庫中。

需要注意的是,上面的代碼只是一個簡單的示例,還需要根據實際情況進行修改和完善,比如加入異常處理、事務管理等功能。

JExcelAPI

使用 JExcelAPI 實現將 Excel 文件中的多個 sheet 導入到數據庫的 Java 代碼:

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
public class ExcelImporter {
 private static final String DB_URL =  jdbc:mysql://localhost:3306/mydatabase 
 private static final String DB_USER =  myuser 
 private static final String DB_PASSWORD =  mypassword 
 private static final String INSERT_SQL =  INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?) 
 public static void main(String[] args) { try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { Workbook workbook = Workbook.getWorkbook(new File( myexcel.xls));
 int numSheets = workbook.getNumberOfSheets();
 for (int i = 0; i   numSheets; i++) { Sheet sheet = workbook.getSheet(i);
 for (int j = 1; j   sheet.getRows(); j++) {
 String col1 = null;
 String col2 = null;
 int col3 = 0;
 for (int k = 0; k   sheet.getColumns(); k++) { Cell cell = sheet.getCell(k, j);
 switch (k) {
 case 0:
 col1 = cell.getContents();
 break;
 case 1:
 col2 = cell.getContents();
 break;
 case 2:
 col3 = Integer.parseInt(cell.getContents());
 break;
 default:
 // Ignore other columns
 break;
 }
 }
 PreparedStatement statement = conn.prepareStatement(INSERT_SQL);
 statement.setString(1, col1);
 statement.setString(2, col2);
 statement.setInt(3, col3);
 statement.executeUpdate();
 }
 }
 System.out.println( Import successful 
 } catch (SQLException e) { e.printStackTrace();
 } catch (Exception e) { e.printStackTrace();
 }
 }
}

在上面的代碼中,首先通過 Workbook 對象讀取 Excel 文件中的數據,然后通過 for 循環遍歷每個 sheet 和每行數據,并將數據插入到數據庫中。在讀取單元格數據時,可以根據單元格的行索引、列索引和數據類型進行類型轉換和賦值。最后通過 PreparedStatement 執行 SQL 插入語句,將數據插入到數據庫中。

需要注意的是,上面的代碼只是一個簡單的示例,還需要根據實際情況進行修改和完善,比如加入異常處理、事務管理等功能。另外,JExcelAPI 只支持舊版的 .xls 格式,不支持 .xlsx 格式。

EasyExcel

使用 EasyExcel 實現將 Excel 文件中的多個 sheet 導入到數據庫的 Java 代碼:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Sheet;
import java.util.ArrayList;
import java.util.List;
public class ExcelImporter {
 private static final String DB_URL =  jdbc:mysql://localhost:3306/mydatabase 
 private static final String DB_USER =  myuser 
 private static final String DB_PASSWORD =  mypassword 
 private static final String INSERT_SQL =  INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?) 
 public static void main(String[] args) { List List Object  data = new ArrayList ();
 EasyExcel.read(myexcel.xlsx , new MyEventListener()).sheet().doRead();
 try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { PreparedStatement statement = conn.prepareStatement(INSERT_SQL);
 for (List Object  row : data) { statement.setString(1, (String) row.get(0));
 statement.setString(2, (String) row.get(1));
 statement.setInt(3, (Integer) row.get(2));
 statement.addBatch();
 }
 statement.executeBatch();
 System.out.println( Import successful 
 } catch (SQLException e) { e.printStackTrace();
 } catch (Exception e) { e.printStackTrace();
 }
 }
 static class MyEventListener extends AnalysisEventListener Object  { private List Object  row = new ArrayList ();
 @Override
 public void invoke(Object data, AnalysisContext context) { row.add(data);
 if (context.getCurrentRowNum() == 0) {
 // Ignore the header row
 row.clear();
 }
 }
 @Override
 public void doAfterAllAnalysed(AnalysisContext context) {
 // Ignore
 }
 @Override
 public void doAfterAllAnalysed(AnalysisContext context) {
 // Ignore
 }
 }
}

在上面的代碼中,首先通過 EasyExcel 對象讀取 Excel 文件中的數據,然后通過 AnalysisEventListener 監聽器將每行數據存儲到一個 List 中,最后將 List 中的數據插入到數據庫中。需要注意的是,在處理每行數據時,需要根據數據類型進行類型轉換和賦值。此外,EasyExcel 支持 .xlsx 和 .xls 格式的 Excel 文件,但由于 .xlsx 格式的文件在讀取時需要占用大量內存,因此建議在處理大量數據時使用 .xls 格式。

需要注意的是,上面的代碼只是一個簡單的示例,還需要根據實際情況進行修改和完善,比如加入異常處理、事務管理等功能。另外,EasyExcel 還提供了很多高級功能,比如讀取大量數據時的分頁讀取、讀取時的數據轉換和驗證等。可以根據實際需求進行使用。

“多個 sheet Excel 數據怎么導入數據庫”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計8780字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 靖边县| 祁连县| 莱阳市| 丰镇市| 河间市| 隆尧县| 莱西市| 邢台市| 莱芜市| 厦门市| 阿坝| 秭归县| 建德市| 资兴市| 军事| 通州市| 兴宁市| 浦江县| 安义县| 固安县| 抚远县| 栾城县| 武邑县| 香格里拉县| 景谷| 湾仔区| 镇安县| 横山县| 泸水县| 平山县| 闻喜县| 江西省| 兴仁县| 凤翔县| 阳曲县| 乌什县| 汕头市| 万全县| 阳泉市| 电白县| 宁蒗|