完整代码,可直接复用!觉着可以记得留赞关注我!
需求:最近一直要提交很多sql工单数据给DB管理员执行,一个一个复制很麻烦,于是写下此方法!如有高见欢迎留言!
注意:记得引入poi包
如果你觉着不错,麻烦帮忙点个赞!分享下!谢谢!
package com.example.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* 功能:读取excel数据,生成批量sql
* @author kangzhuang
* @date 20190822
*
*/
public class ExcelReadUtil {
private static Logger logger = LoggerFactory.getLogger(ExcelReadUtil.class);
private static Workbook workbook;
private static Sheet sheet;
/**
* 初始化表格,判断文件格式是xls还是xlsx
* @param excelPath
*/
private static void initExcel(String excelPath){
if (StringUtils.isEmpty(excelPath)){
logger.info("文件路径不能为空");
workbook = null;
return;
}
try {
InputStream is = new FileInputStream(excelPath);
if (excelPath.endsWith(".xls")){//.xls格式
workbook = new HSSFWorkbook(is);
}else if(excelPath.endsWith(".xlsx")){//.xlsx格式
workbook = new XSSFWorkbook(is);
}else{
workbook = null;
logger.info("无法转换的Excel文件格式(后缀名应为:.xls或.xlsx)");
}
} catch (FileNotFoundException e) {
logger.info("找不到指定文件");
} catch (IOException e) {
logger.info("IO异常");
}
}
/**
* 读取Excel文件并解析成json字符串后写入新的文件
* @param excelPath 要解析的Excel文件路径(具体文件)
* @param fromRow 指定开始读取的行数,如从第2行开始则为2
* @param filePath 写入后的文件保存位置(文件路径)
* @param sql sql 语句
*@param index 指定哪些位置是字符串,需要特殊处理,从0开始
*/
private static void readExcelToJsonFile(String excelPath, int fromRow, String filePath,String sql,int[] index){
initExcel(excelPath);
if(workbook == null){
logger.info("初始化工作簿失败");
return;
}
List<String> sqlList = new ArrayList<String>();
//遍历sheet
for(int s=0; s<workbook.getNumberOfSheets(); s++){
sheet = workbook.getSheetAt(s);
//首行,即json-key
Row headerRow = getRow(sheet, 1);
//总行数
int rowNum = sheet.getLastRowNum() + 1;
//遍历行,从fromRow行开始遍历
for(int i=(fromRow-1); i<rowNum; i++){
// TODO sql是变化的
StringBuilder sqlContent= new StringBuilder(sql);
Row row = sheet.getRow(i);
if(row == null){
continue;
}
//总列数
int cellNum = row.getLastCellNum();
//遍历单元格
for(int j=0; j<cellNum; j++){
String key = getCellValue(headerRow.getCell(j));
String value = getCellValue(row.getCell(j));
if(!StringUtils.isEmpty(key) && !StringUtils.isEmpty(value)){
boolean flag =false;
// TODO 注意如果有字段是字符串类型则需要加引号
for (int k = 0; k < index.length; k++) {
if (j==index[k]){
flag =true;
}
}
if (flag){
sqlContent.append("'");
}
sqlContent.append(value);
if (flag){
sqlContent.append("'");
}
sqlContent.append(",");
}
}
//一行正好是一条数据,结尾
sqlContent =new StringBuilder(sqlContent.substring(0,sqlContent.length()-1)).append(");").append("rn");
sqlList.add(sqlContent.toString());
}
fileWrite(filePath,sqlList);
}
}
/**
* 获取指定行
* @param sheet
* @param rowNum
* @return
*/
private static Row getRow(Sheet sheet, int rowNum){
if(sheet == null){
return null;
}
return sheet.getRow(rowNum - 1);
}
/**
* 获取单元格的值
* @param cell
* @return 单元格值
*/
private static String getCellValue(Cell cell){
String cellValue = "";
if(cell != null){
switch (cell.getCellType()){//单元格类型
case Cell.CELL_TYPE_BOOLEAN://布尔类型
cellValue = cell.getBooleanCellValue() + "";
break;
case Cell.CELL_TYPE_NUMERIC://数字类型
if (DateUtil.isCellDateFormatted(cell)) {//格式化后的日期数值类型
cellValue = new DataFormatter().formatCellValue(cell);
} else {
//数值
double value = cell.getNumericCellValue();
int intValue = (int) value;
cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);
}
break;
case Cell.CELL_TYPE_FORMULA:{//公式
try{
cellValue = cell.getNumericCellValue() + "";
}catch(IllegalStateException e){
cellValue = String.valueOf(cell.getRichStringCellValue());
}
}
break;
case Cell.CELL_TYPE_STRING://字符串
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_BLANK://空值
cellValue = "";
break;
case Cell.CELL_TYPE_ERROR://故障
cellValue = "非法字符";
break;
default:
cellValue = "未知类型";
break;
}
}
return cellValue.trim();
}
private static void fileWrite(String filePath, List<String> sqlList){
//创建一个文件
File file= new File(filePath);
OutputStream out =null;
try {
//打开文件输出流
out=new FileOutputStream(file);
for (int i = 0; i < sqlList.size(); i++) {
//读取输出流中的字节
byte[] bytes= sqlList.get(i).getBytes();
//写入文件
out.write(bytes);
}
logger.info("写文件"+file.getAbsolutePath()+"成功!");
}catch(IOException e) {
logger.error("写文件"+file.getAbsolutePath()+"失败!",e);
}
finally {
if(out!=null) {
try {
//关闭输出文件流
out.close();
}catch(IOException e) {
logger.error("写文件"+file.getAbsolutePath()+"失败!",e);
}
}
}
}
// 只需传参数就可以了
public static void main(String[] args) {
String test = "C:\Users\Administrator\Desktop\优质.xlsx";
String filePath = "C:\Users\Administrator\Desktop\优质sql.txt";
String sql = "insert into 表名(参数) value(";
// 指定字符串位置
int[] index=new int[]{1,2,3,4,5,6};
readExcelToJsonFile(test,2, filePath,sql,index);
}
}
最后
以上就是糟糕大树最近收集整理的关于java读取excel文件并写入.txt文件中的全部内容,更多相关java读取excel文件并写入内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复