Java读取多个excel内容插入数据库

     最近有个需求是做个数据导入的接口,对方入到进来若干个excel文档,每个文档对应数据库中不同表的内容。数据格式:INFO文件中存放若10张excel文档,文档名称格式为表名-描述(如user-用户表.xls)。
下面将这个过程记录下来,方便之后的查看。

第一步、定义一个Map,用于存放excel文件中所有列的信息。

以user表为例,存放其中字段的信息,代码如下,仅供参考。

private Map<String, Object> getExcelFileType() {
	Map<String, Object> Map = new HashMap<String, Object>();
	JSONObject jsonData = new JSONObject();
	jsonData.put("name", "Str");             //不同类型的数据
	jsonData.put("date", "DateTime");
	Map.put("user", jsonData);
	return Map;
}
第二步、 日志设置

     数据处理过程中需要记录日志信息。这里使用的是 java.util.logging,配置相关的设置,可以将程序中的导入情况输出到日志中,方便查看。代码如下,仅供参考。

Logger log = Logger.getLogger("tesglog");   //日志
//设置日志的级别
log.setLevel(Level.ALL); 
//设置日志存放的路径
FileHandler fileHandler = new FileHandler("D:\import.log");  
fileHandler.setLevel(Level.ALL);  
fileHandler.setFormatter(new LogFormatter());  
log.addHandler(fileHandler);  
}

程序执行中会将相应的信息写入到指定的out文件中,程序执行后,可以查看执行的结果信息。

第三步 读取文件夹内容

思路
1、读取文件夹,遍历其中的excel文件,获取文件名称
2、定义两个变量sqlcolumn 和sqlvalue,分别用于存放拼接的列和值的信息。
3、按行遍历excel文件内容, 第二行开始,对每个单元格进行读取,根据是否有值来进行拼接插入的字符串。
4、运用jdbcOperations来执行拼接的sql语句,实现数据的入库。
程序实现的代码如下所示,仅供参考。

//读取文件夹的信息
File fileINFO = new File("D:\INFO");
if(fileINFO.isDirectory()){
	String[] fileINFOlist = fileINFO.list();
	for(int i = 0 ; i< fileINFOlist.length; i++ ){
	TableName=fileINFOlist[i].substring(0, fileINFOlist[i].indexOf('-'));  	`	//截取获取表名
	filePath=fileINFO+"\\"+fileINFOlist[i];      //拼接excel文件的路径
	//以流 逐个读取文件夹中的文件
	stream = new FileInputStream(file);
	//读取工作簿
	Workbook book = new Workbook(stream);
	WorksheetCollection sheets = book.getWorksheets();  //获取sheet信息
	// 获取表格中的所有单元格
	Cells cells = sheets.get(0).getCells();       //从第一行开始取单元格
	int maxColumnCount = cells.getMaxColumn()+1; //获取最大列
	int rowCount = cells.getLastDataRow(1);      //获取最近数据行
	String cellValue = new String();               //单元格的信息串
	StringBuffer errorReport = new StringBuffer();   // 检验错误信息
	//获取excel文件中的所有列信息   --自定义的方法
	Map<String, Object> ExcelFile = getExcelFileType();      
	JSONObject  jsonObject =(JSONObject) ExcelFile.get(TableName);
	// 判断表格列数是否符合要求
	int mm=jsonObject.size();
	if (maxColumnCount != jsonObject.size()) {
		map.put("success", "false");
		log.info("列的数量不正确!"+fileINFOlist[i]+"信息只能"+jsonObject.size()+"列值!");
		return;
		}
		
 	int k = 2; //从第2行开始取值
 	for (; k <= rowCount; k++) {     //从第二行开始读数据
		int j = 0;
		Iterator<String> male_Iterator = jsonObject.keys();
		//拼接数据库插入sql insert
		String  sqlcolumn = " INSERT INTO "+TableName+" ( ";
		//拼接数据库插入sql value值
		String  sqlvalue = " ) VALUES( ";
		int tableNameID=0;
		while(male_Iterator.hasNext()){   //迭代器遍历
			//获得单元格的value值
			Cell cell = cells.get(k, j);//单元格
			// 单元格内数据
			cellValue = (null == cell.getValue() ||cell.getValue().equals("")? null: cell.getStringValue().trim());
			// 获得key 
			String key = male_Iterator.next();
			if(cellValue != null){
				sqlcolumn += key+",";    //拼接列值,如: insert into user
				String dataType = jsonObject.getString(key);
				if(dataType.equals("Str")){  
					sqlvalue+= "'"+cellValue+"',";
				}else if(dataType.equals("DateTime")){   //排序字段
					sqlvalue+= " DATE_FORMAT('"+cellValue+"','%Y-%m-%d %H:%i:%s'),";
				}else {
					sqlvalue+= "'"+cellValue+"',";
				}				
		     }
	    }
	    //读取完整行数据 拼接一条insert插入语句执行
	    sqlcolumn = sqlcolumn.substring(0,sqlcolumn.length()-1);  //去除逗号
		sqlvalue = sqlvalue.substring(0,sqlvalue.length()-1);  //去除逗号
		String insertsql = sqlcolumn + sqlvalue+") ";
		//这里运用jdbcOperations来实现数据库的操作
		try {
				jdbcOperations.update(insertsql);
			} catch (Exception e) {
				map.put("success", "false");
				map.put("msg", fileINFOlist[i]+" 文件中 第" + (k+1) + "行数据插入失败,请核查该条数据。;");
				log.info(fileINFOlist[i]+"文件中 第" + (k+1) + "行数据插入失败,请核查该条数据。");
				log.info("错误日志信息为:"+e.getMessage());
		}
	}
}

总结:读取excel文件的内容功能较为常见,这里采用的主要是提前将文件中的列写入到map中,根据类型来进行取值,拼接sql来实现数据的入库。

博客参考

【1】https://blog.csdn.net/gxx_csdn/article/details/79085713

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java多线程读取Excel的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; 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.ss.usermodel.WorkbookFactory; public class ExcelReader { private static final int THREAD_COUNT = 5; // 线程数 private static final String FILE_PATH = "test.xlsx"; // Excel文件路径 public static void main(String[] args) throws Exception { File file = new File(FILE_PATH); if (!file.exists()) { throw new IOException("文件不存在!"); } ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT); Workbook workbook = WorkbookFactory.create(new FileInputStream(file)); int sheetCount = workbook.getNumberOfSheets(); for (int i = 0; i < sheetCount; i++) { Sheet sheet = workbook.getSheetAt(i); int rowCount = sheet.getPhysicalNumberOfRows(); int perThreadRowCount = rowCount / THREAD_COUNT; for (int j = 0; j < THREAD_COUNT; j++) { int startIndex = j * perThreadRowCount; int endIndex = (j == THREAD_COUNT - 1) ? rowCount : (j + 1) * perThreadRowCount; executorService.execute(new ExcelReaderTask(sheet, startIndex, endIndex)); } } executorService.shutdown(); } private static class ExcelReaderTask implements Runnable { private Sheet sheet; private int startIndex; private int endIndex; public ExcelReaderTask(Sheet sheet, int startIndex, int endIndex) { this.sheet = sheet; this.startIndex = startIndex; this.endIndex = endIndex; } @Override public void run() { List<List<String>> dataList = new ArrayList<>(); for (int i = startIndex; i < endIndex; i++) { Row row = sheet.getRow(i); if (row == null) { continue; } List<String> rowData = new ArrayList<>(); int cellCount = row.getPhysicalNumberOfCells(); for (int j = 0; j < cellCount; j++) { Cell cell = row.getCell(j); if (cell == null) { rowData.add(""); } else { rowData.add(cell.toString()); } } dataList.add(rowData); } // TODO: 将dataList插入MongoDB } } } ``` 该示例代码使用了Apache POI库来读取Excel文件,使用多线程的方式提高读取速度。具体实现方式是将Excel文件按行分割成多个区间,每个区间由一个线程负责读取读取后的数据可以插入MongoDB等数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值