版权声明:嗯哼 https://blog.csdn.net/lfy609225258/article/details/82773006
java要导入Excel数据, 那么首先要读取Excel 至于 把读取到的数据存入数据库 那就很简单啦 ,略过咯
下面讲一讲 读取Excel数据 :
1.首先 要通过磁盘路径和文件名 获取Excel文件,如果文件不在项目运行的服务器上,要先把Excel文件上传到服务器指定磁盘下,然后再通过该路径获取文件,直接以流的形式传输到后台也是可以的.
第一步 导入文件到java项目运行地
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.szboanda.wdsa.exportData.service.DbResultService;
import com.szboanda.wdsa.surfacwater.pjfw.service.SurfacWaterAutoEvaluateService;
import net.sf.json.JSONObject;
/**
* 导入excel
* @author Administrator
*
*/
public class ImportFile {
ParseFile parseFile = new ParseFile();//Excel文件处理层
private String uploadPath = "C:/ImportExcelFile/"; // 上传文件的目录
File tempPathFile;
DbResultService dbservice = new DbResultService();
/**
*第一步 导入文件
* @throws IOException
* @throws FileUploadException
*/
public void importFile(HttpServletRequest req, HttpServletResponse res) throws IOException, FileUploadException{
//接收参数
DiskFileItemFactory factorypage = new DiskFileItemFactory();
ServletFileUpload uploadpage = new ServletFileUpload(factorypage);
List<FileItem> itemspage = uploadpage.parseRequest(req);
Map<String, String> params = new HashMap<String,String>();
for(Object object:itemspage){
FileItem fileItem = (FileItem) object;
if (fileItem.isFormField()) {
params.put(fileItem.getFieldName(), fileItem.getString("utf-8"));//如果你页面编码是utf-8的
}
}
//使用params.get获取参数值
String year = (String) params.get("year");
String month = (String) params.get("month");
String type = (String) params.get("type");
JSONObject obj = new JSONObject();
try {
//查看文件夹是否存在 .如果不存在则创建文件夹
judeDirExists(uploadPath);
// 为基于磁盘的文件项创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置工厂约束
factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
factory.setRepository(tempPathFile);// 设置缓冲区目录
// 创建一个新文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置总体请求大小约束
upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
//iterator 迭代器
Iterator<FileItem> i = itemspage.iterator();
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
String fileName = fi.getName();
if (fileName != null) {
//获取文件流
File fullFile = new File(new String(fi.getName().getBytes(), "utf-8")); // 解决文件名乱码问题
//获取文件名 创建新的文件
File savedFile = new File(uploadPath, fullFile.getName());
String filename = fullFile.getName();
String filetype = filename.substring(filename.lastIndexOf("."));
//判断是否为xml后缀的文件(支持.xls 和.xlsx 两种格式文件)
if(filetype.equals(".xls")||filetype.equals(".xlsx")){
//在这里保存文件到本地
fi.write(savedFile);
getHLData(uploadPath,filename); //读取Excel文件方法.
}
}
}
//上传成功
} catch (Exception e) {
e.printStackTrace();
}
res.getWriter().println(obj); //用来给前端返回导入情况, 自己视情况写写
}
// 判断文件夹是否存在
public static void judeDirExists(String file) {
try {
if (!(new File(file).isDirectory())) {
new File(file).mkdir();
}
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
第二部分, 读取Excel文件中的数据
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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;
import com.szboanda.platform.util.BeanUtils;
import com.szboanda.platform.util.helper.ActionHelper;
import com.szboanda.wdsa.importExcel.importFile.dao.ImportDAO;
import jxl.read.biff.BiffException;
import net.sf.json.JSONObject;
//第二部分, 查看
public class ParseFile {
ImportDAO dao = new ImportDAO();
//读取excel 用来兼容 .xls 和 .xlsx 两种格式
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);
if(".xls".equals(extString)){
return wb = new HSSFWorkbook(is);
}else if(".xlsx".equals(extString)){
return wb = new XSSFWorkbook(is);
}else{
return wb = null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return wb;
}
// 通过文件名和路径 找到Excel 然后读取Excel中的数据
public Object getHLData(String filepath, String filename) throws Exception {
// 通过文件的磁盘路径 获取文件流.
Workbook wb = readExcel(filepath + filename);
// 获得第一个工作表对象(ecxel中sheet的编号从0开始,0,1,2,3,....)
Sheet sheet = wb.getSheetAt(sheetnum);
// 行数
int rownum = sheet.getPhysicalNumberOfRows();
//创建list对象
List<Map<String,Object> datalist = new ArrayList<>();
//获取第0行, 也就是最上面一行, 一般用来做表头 字段
Row row0 = sheet.getRow(0);
for (int i = 1; i < rownum; i++) {
//循环获取Excel中的每行数据
Row row = sheet.getRow(i);
//获取该行的数据列数
int linenum = row.getPhysicalNumberOfCells();
Map<String,Object> map = new HashMap<>();
//获取该行每一列数据
for (int n = 0; n < linenum ; n++) {
//获取该列字段名
String linename = row0.getCell(n).toString();
//获取该行 第0列的数据, 以次类推
String linedata = row.getCell(n).toString();
//建立一个map对象 然后将每一个格的数据放入map中, 然后就可以用来插入数据库中
map.put(linename,linedata);
****** 此处省略
}
datalist.add(map);
}
//此时获取的数据都存入datalist中, 然后将datalist 批量插入数据库即可
dao.insertData(datalist);
Object obj = new Object();
return obj;//返回运行结果, 内容自行设定
}
}
以上代码都是功能主体部分, 其他的操作可自行添加.,,
需要导入poi的几个jar包. 到时可搜索一下