Java 读取EXCEL表格中的数据,将数据转为SQL语句

本文介绍了如何使用Apache POI库读取Excel文件,并通过SQL语句更新camera表中的点位编号,以实现从用户提供的Excel数据源进行数据库同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文档

一、需求

存在一个camera表,表中有一个字段叫点位编号,现需要修改该点位编号,用户提供了一个execl表,如下图所示,第2列为原编号,第5列为现编号:
在这里插入图片描述

二、解决思路

编码读取execl表格数据,将新的编码通过sql语句保存到camera表中,因为camera表有未使用的字段且原来的编码是唯一的,所以我这里就根据原来的编码字段来更新(update)现编码保存的字段;

三、引入相关依赖
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
	<dependency>
	    <groupId>org.apache.commons</groupId>
	    <artifactId>commons-collections4</artifactId>
	    <version>4.1</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi</artifactId>
	    <version>3.17-beta1</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi-ooxml</artifactId>
	    <version>3.17-beta1</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi-ooxml-schemas</artifactId>
	    <version>3.17-beta1</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
	<dependency>
	    <groupId>org.apache.xmlbeans</groupId>
	    <artifactId>xmlbeans</artifactId>
	    <version>2.6.0</version>
	</dependency>
四、编码

4.1、创建与excel表对应的实体类

package com.qst.parsexml.domain;


public class HaiXinCamera {

	private String name;
	private String extcameraid;
	private String ip;
	private String port;
	private String crossing_number;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getExtcameraid() {
		return extcameraid;
	}

	public void setExtcameraid(String extcameraid) {
		this.extcameraid = extcameraid;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public String getPort() {
		return port;
	}

	public void setPort(String port) {
		this.port = port;
	}

	public String getCrossing_number() {
		return crossing_number;
	}

	public void setCrossing_number(String crossing_number) {
		this.crossing_number = crossing_number;
	}
}

4.2、新建一个ReadExecl.java类,创建main函数

package com.qst.parsexml.test;

import com.qst.parsexml.service.execl.ParseServiceExecl_wangcheng;
import java.io.IOException;
import java.util.Scanner;

public class ReadExecl {

    public static void main(String[] args) {
        System.out.println("请输入excel文件路径: [execl文件路径] ");
        Scanner scanner = new Scanner(System.in);
        String[] strs = scanner.nextLine().split("\\s+");
        String filepath = strs[0];
        try {
            //将提供的execl文档中的点位编码保存到camera表中的crossing_number字段中
            ParseServiceExecl_wangcheng.parseExecl(filepath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.3、新建一个ParseServiceExecl_wangcheng.java类,写相关逻辑

package com.qst.parsexml.service.execl;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

import com.qst.parsexml.domain.HaiXinCamera;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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 ParseServiceExecl_wangcheng {

  public static void parseExecl(String filepath) throws IOException{

    Workbook wb =null;
    Sheet sheet = null;
    Row row = null;
    List<HaiXinCamera> list = null;
    String cellData = null;
    //读取Excel文件
    wb = readExcel(filepath);
    //如果文件不为空
    if(wb != null){
      //用来存放表中数据
      list = new ArrayList<HaiXinCamera>();
      //获取第一个sheet
      sheet = wb.getSheetAt(0);
      //获取最大行数
      int rownum = sheet.getPhysicalNumberOfRows();
      //获取第一行
      row = sheet.getRow(0);
      //获取最大列数
      int colnum = row.getPhysicalNumberOfCells();
      //循环行
      for (int i = 1; i<rownum; i++) {
        HaiXinCamera camera = new HaiXinCamera();
        row = sheet.getRow(i);
        if(row !=null){
          //循环列
          for (int j=0;j<colnum;j++){
            cellData = (String) getCellFormatValue(row.getCell(j));
            switch (j){
              case 0:
                camera.setName(cellData);
                break;
              case 1:
                camera.setExtcameraid(cellData);
                break;
              case 2:
                camera.setIp(cellData);
              break;
              case 3:
                camera.setPort(cellData);
                break;
              case 4:
                camera.setCrossing_number(cellData);
                break;
              default:
                break;
            }
          }
          //放入集合
          list.add(camera);
        }else{
          break;
        }
      }
    }
    //定义一个文件,用来存数据;
    System.out.println("number of camera: "+list.size());
    String fileName = filepath.substring(0, filepath.length()-4)+"_update_camera"+".sql";
    PrintWriter ps = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8")));
    if(list.size() > 0){
     //遍历解析出来的list
      for (HaiXinCamera camera : list ) {

        String name = camera.getName() == null ? "null" : "'" + camera.getName() + "'";
        String extcameraid = camera.getExtcameraid() == null ? "null" : "'" + camera.getExtcameraid() + "'";
        String ip = camera.getIp() == null ? "null" : "'" + camera.getIp() + "'";
        String port = camera.getPort() == null ? "null" : "'" + camera.getPort() + "'";
        String crossingNumber = camera.getCrossing_number() == null ? "null" : "'" + camera.getCrossing_number() + "'";

        String strSQL = String.format("UPDATE camera set crossing_number= %s WHERE extcameraid = %s;",crossingNumber, extcameraid);
        ps.println(strSQL);
      }
    }
    ps.close();
  }

  //读取excel
  @SuppressWarnings("resource")
  public static Workbook readExcel(String filePath){
    Workbook wb = null;
    if(filePath==null){
      return null;
    }
    //文件后缀名
    String extString = filePath.substring(filePath.lastIndexOf("."));
    InputStream is = null;
    try {
      is = new FileInputStream(filePath);
      //如果文件后缀名为xls
      if(".xls".equals(extString)){
        return wb = new HSSFWorkbook(is);
      }//如果文件后缀名为xlsx
      else if(".xlsx".equals(extString)){
        return wb = new XSSFWorkbook(is);
      }else{
        return wb = null;
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return wb;
  }

  @SuppressWarnings("deprecation")
  public static Object getCellFormatValue(Cell cell){
    Object cellValue = null;
    if(cell!=null){
      //判断cell类型
      switch(cell.getCellType()){
        case Cell.CELL_TYPE_NUMERIC:{
          cellValue = String.valueOf(cell.getNumericCellValue());
          break;
        }
        case Cell.CELL_TYPE_FORMULA:{
          //判断cell是否为日期格式
          if(DateUtil.isCellDateFormatted(cell)){
            //转换为日期格式YYYY-mm-dd
            cellValue = cell.getDateCellValue();
          }else{
            //数字
            cellValue = String.valueOf(cell.getNumericCellValue());
          }
          break;
        }
        case Cell.CELL_TYPE_STRING:{
          cellValue = cell.getRichStringCellValue().getString();
          break;
        }
        default:
          cellValue = "";
      }
    }else{
      cellValue = "";
    }
    return cellValue;
  }
}

4.4、结果:
执行代码,输入excel文件所在的路径,如C:\Users\MECHREVO-PC\Desktop\test.xlsx,回车之后就会在该路径下生成以sql结尾的文件;本文的输出结果如图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值