文章目录
jsp使用webuploader上传excel mysql导入导出 apache-poi
关键词:jsp,webuploader,excel上传导入导出,mysql
目标
- 让excel上传到服务器并让插入数据到数据库
- 如果需要下载则将数据库中的数据导出成excel并成功让用户下载
效果
大致思路
前端实现:layui,webuploader,jsp
后端实现:apache.poi,mysql,servlet,fastjson,commons-io
日志组件:slf4j,log4j
前端使用layui来实现,用webuploader
作上传组件上传excel,用apache-poi
操作excel导入和导出,编写了一个工具类ExcelUtil
最开始从add.jsp
开始,需要上传就到uploadservlet
中,操作是将excel传到服务器并且存入数据库中(我加了一个id字段)
list.jsp
即查看数据库中有多少个excel表格,数据是从data.jsp中传入的
如果需要下载则通过downloadservlet
生成excel并下载
现在的我后知后觉,应该把那些顶部的abcde…设成字段,傻了傻了
代码
util
excelUtil
excel工具类
package top.sehnsucht.utils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import top.sehnsucht.dao.ExcelDao;
import top.sehnsucht.dao.impl.ExcelDaoImpl;
import top.sehnsucht.service.ExcelService;
import top.sehnsucht.service.impl.ExcelServiceImpl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
/**
* @Description: excel工具类
* @Author: Cai
* @CreateTime: 2021/11/19
*/
public class ExcelUtil {
/**
* 将name文件从数据库中读取出来
* @throws IOException
*/
public static void createExcelFile(String name, String path) throws Exception {
ExcelDao dao = new ExcelDaoImpl();
ArrayList<ArrayList<String>> allList = dao.dataToExcel(name);
File excelFile = new File(path);
if (!excelFile.exists()) {
excelFile.mkdirs();
}
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet();
CellStyle cellStyle = wb.createCellStyle();
// 字体
Font font = wb.createFont();
font.setFontName("等线");
font.setFontHeightInPoints((short) 20);
cellStyle.setFont(font);
for (int i = 0; i < allList.size(); i++) {
// 3、创建行对象
Row row = sheet.createRow(i);
for (int j = 0; j < allList.get(i).size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(allList.get(i).get(j));
cell.setCellStyle(cellStyle);
}
}
OutputStream os = new FileOutputStream(path + "\\" + name + ".xls");
wb.write(os);
os.close();
}
/**
* 将filePath的文件存入数据库
* @param name
* @param filePath
* @throws IOException
*/
public static void readExcelFile(String name, String filePath) throws IOException {
ExcelDao dao = new ExcelDaoImpl();
ExcelService service = new ExcelServiceImpl(dao);
File xlsFile = new File(filePath);
// 工作表
Workbook workbook = WorkbookFactory.create(xlsFile);
// 表个数。
int numberOfSheets = workbook.getNumberOfSheets();
// 遍历表。
for (int i = 0; i < numberOfSheets; i++) {
Sheet sheet = workbook.getSheetAt(i);
// 行数。
int rowNumbers = sheet.getLastRowNum() + 1;
// Excel第一行。
Row temp = sheet.getRow(0);
if (temp == null) {
continue;
}
int cells = temp.getPhysicalNumberOfCells();
ArrayList<String> list = new ArrayList<String>();
// 读数据。
for (int row = 0; row < rowNumbers; row++) {
if (row == 0) {
Row r = sheet.getRow(row);
for (int col = 0; col < cells; col++) {
if (r.getCell(col) == null) {
list.add("null");
} else {
list.add(r.getCell(col).toString());
}
}
System.out.println(list);
service.createExcel(name,list);
continue;
}
ArrayList<String> data = new ArrayList<String>();
Row r = sheet.getRow(row);
for (int col = 0; col < cells; col++) {
if (r.getCell(col) == null) {
data.add("null");
} else {
data.add(r.getCell(col).toString());
}
}
service.addExcel(name,list,data);
}
}
}
}
DBUtil
package top.sehnsucht.utils;
import lombok.extern.slf4j.Slf4j;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.log4j.Logger;
/**
* @Description:
* @Author: Cai
* @CreateTime: 2021/10/29
*/
@Slf4j
public class DBUtil {
// 定义数据库连接参数
public static final String DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/excel";
public static final String USERNAME = "root";
public static final String PASSWORD = "818181";
// 注册数据库驱动
static {
try {
Class.forName(DRIVER_CLASS_NAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取连接
public static Connection getConn() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
// 关闭连接
public static void closeConn(Connection conn) {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭连接失败!");
e.printStackTrace();
}
}
}
//测试
public static void main(String[] args) throws SQLException {
System.out.println(DBUtil.getConn());
}
}
servlet
DownloadServlet
package top.sehnsucht;
import org.apache.log4j.Logger;
import top.sehnsucht.dao.ExcelDao;
import top.sehnsucht.dao.impl.ExcelDaoImpl;
import top.sehnsucht.service.ExcelService;
import top.sehnsucht.service.impl.ExcelServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Description:
* @Author: Cai
* @CreateTime: 2021/11/20
*/
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Logger logger = Logger.getLogger(this.getClass());
String path = req.getSession().getServletContext().getRealPath("/") + "\\excel";
String name = req.getParameter("name");
logger.info(path);
logger.info(name);
ExcelDao dao = new ExcelDaoImpl();
ExcelService service = new ExcelServiceImpl(dao);
service.DataToExcel(name,path);
resp.setContentType("application/vnd.ms-excel");
req.getRequestDispatcher("/excel/" + name + ".xls").forward(req,resp);
req.getRequestDispatcher("/list").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
JDBCServlet
package top.sehnsucht;
import org.apache.log4j.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
public class JDBCServlet extends HttpServlet {
private Logger logger = Logger.getLogger(this.getClass());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String strBackUrl = "http://" + req.getServerName() + ":" + req.getServerPort() + "/list.jsp";
resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
resp.setHeader("Location", strBackUrl);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Log4jServlet
package top.sehnsucht;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import java.io.File;
/**
* @Description:
* @Author: Cai
* @CreateTime: 2021/11/12
*/
public class Log4JInitServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("Log4JInitServlet 正在初始化 log4j日志设置信息");
String log4jLocation = config.getInitParameter("log4j-properties-location");
ServletContext sc = config.getServletContext();
String str= sc.getInitParameter("test");
System.out.println("str:"+str);
if (log4jLocation == null) {
System.err.println("*** 没有 log4j-properties-location 初始化的文件, 所以使用 BasicConfigurator初始化");
BasicConfigurator.configure();
} else {
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
File yoMamaYesThisSaysYoMama = new File(log4jProp);
if (yoMamaYesThisSaysYoMama.exists()) {
System.out.println("使用: " + log4jProp+"初始化日志设置信息");
PropertyConfigurator.configure(log4jProp);
} else {
System.err.println("*** " + log4jProp + " 文件没有找到, 所以使用 BasicConfigurator初始化");
BasicConfigurator.configure();
}
}
super.init(config);
}
}
uploadServlet
package top.sehnsucht;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
import top.sehnsucht.utils.ExcelUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Description:
* @Author: Cai
* @CreateTime: 2021/10/29
*/
public class UploadServlet extends HttpServlet {
private Logger logger=Logger.getLogger(this.getClass());
private Lock lock = new ReentrantLock();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
lock.lock();
try {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=UTF-8");
logger.info("单次请求" + req);
//判断文件是否可以上传
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
//可以上传,有问题就报异常
if (isMultipart) {
//创建一个FileItem工厂,通过工厂创建文件上传核心组件ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
try {
//通过核心上传组件解析request请求,获取表单的所有表单项,表单的每一个表单项对应一个FileItem
List<FileItem> items = upload.parseRequest(req);
Iterator<FileItem> it = items.iterator();
for (FileItem item : items) {
if (item.isFormField()) {
logger.error("其他类型");
} else {
for (String s : item.getName().split("\\.")) {
logger.error(s);
}
if (!item.getName().split("\\.")[item.getName().split("\\.").length - 1].equals("xls")) {
continue;
}
String filename = item.getName();
String path = req.getSession().getServletContext().getRealPath("/") + "\\1";
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
file = new File(path, filename);
item.write(file);
logger.debug(filename + "上传成功");
ExcelUtil.readExcelFile(filename.split("\\.")[0],path + "\\" + filename);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
logger.debug("解锁");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
service and dao
ExcelService
package top.sehnsucht.service;
import java.util.ArrayList;
import java.util.Map;
public interface ExcelService {
void createExcel(String name, ArrayList<String> list);
void addExcel(String name, ArrayList<String> list, ArrayList<String> data);
ArrayList<Map<String, String>> showTable();
void DataToExcel(String name,String path);
}
ExcelServiceImpl
package top.sehnsucht.service.impl;
import top.sehnsucht.dao.ExcelDao;
import top.sehnsucht.service.ExcelService;
import top.sehnsucht.utils.ExcelUtil;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
/**
* @Description:
* @Author: Cai
* @CreateTime: 2021/11/19
*/
public class ExcelServiceImpl implements ExcelService {
private ExcelDao dao;
public ExcelServiceImpl(ExcelDao dao) {
this.dao = dao;
}
@Override
public void createExcel(String name, ArrayList<String> list) {
try {
dao.createExcel(name, list);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void addExcel(String name, ArrayList<String> list, ArrayList<String> data) {
try {
dao.addExcel(name, list, data);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public ArrayList<Map<String, String>> showTable() {
try {
return dao.showTable();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void DataToExcel(String name,String path) {
try {
ExcelUtil.createExcelFile(name,path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ExcelDao
package top.sehnsucht.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
public interface ExcelDao {
void createExcel(String name,ArrayList<String> list) throws SQLException;
void addExcel(String name, ArrayList<String> list, ArrayList<String> data) throws Exception;
ArrayList<Map<String, String>> showTable() throws Exception;
ArrayList<ArrayList<String>> dataToExcel(String name) throws Exception;
}
ExcelDaoImpl
package top.sehnsucht.dao.impl;
import org.apache.log4j.Logger;
import top.sehnsucht.dao.ExcelDao;
import top.sehnsucht.utils.DBUtil;
import java.io.FileInputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* @Description:
* @Author: Cai
* @CreateTime: 2021/11/19
*/
public class ExcelDaoImpl implements ExcelDao {
private Logger logger = Logger.getLogger(this.getClass());
@Override
public void createExcel(String name, ArrayList<String> list) throws SQLException {
Connection conn;
Statement stmt;
conn = DBUtil.getConn();
stmt = conn.createStatement();
String sql = "create table " + name + "(id int not null auto_increment primary key";
for (String s : list) {
sql += " , " + s + " varchar(100) ";
}
sql += " ) default charset = utf8;";
stmt.executeUpdate(sql);
logger.debug("创建表完成");
stmt.close();
DBUtil.closeConn(conn);
}
@Override
public void addExcel(String name, ArrayList<String> list, ArrayList<String> data) throws Exception {
Connection conn;
PreparedStatement ps = null;
conn = DBUtil.getConn();
String sql = "insert into " + name + " ( ";
for (int j = 0; j < list.size(); j++) {
if (j == 0) {
sql += list.get(j);
} else {
sql += ", " + list.get(j);
}
}
sql += " ) values ( ";
for (int j = 0; j < list.size(); j++) {
if (j == 0) {
sql += " ? ";
} else {
sql += " , ? ";
}
}
sql += ");";
ps = conn.prepareStatement(sql);
for (int j = 0; j < data.size(); j++) {
ps.setString(j + 1, data.get(j));
}
int count = ps.executeUpdate();
if (count <= 0) {
logger.error("插入失败!");
}
DBUtil.closeConn(conn);
ps.close();
}
@Override
public ArrayList<Map<String, String>> showTable() throws Exception {
Connection conn;
PreparedStatement ps;
ResultSet rs;
ArrayList<Map<String, String>> arrs = new ArrayList<>();
conn = DBUtil.getConn();
String sql = "show tables;";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery(sql);
while (rs.next()) {
Map<String, String> map = new HashMap();
String username = rs.getString(1);
map.put("name", username);
arrs.add(map);
}
DBUtil.closeConn(conn);
ps.close();
return arrs;
}
@Override
public ArrayList<ArrayList<String>> dataToExcel(String name) throws Exception {
Connection conn;
PreparedStatement ps;
ResultSet rs;
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
conn = DBUtil.getConn();
String sql = "select * from " + name;
ps = conn.prepareStatement(sql);
rs = ps.executeQuery(sql);
ResultSetMetaData rsMetaData = rs.getMetaData();
int count = rsMetaData.getColumnCount();
ArrayList<String> header = new ArrayList<>();
for (int i = 1; i <= count; i++) {
System.out.println(rsMetaData.getColumnName(i));
header.add(rsMetaData.getColumnName(i));
}
list.add(header);
while (rs.next()) {
ArrayList<String> some = new ArrayList<String>();
for (int i = 1; i <= count; i++) {
if ("null".equals(rs.getString(i))) {
some.add("");
} else {
some.add(rs.getString(i));
}
}
list.add(some);
}
DBUtil.closeConn(conn);
ps.close();
return list;
}
}
jsp
add.jsp
<%--
Created by IntelliJ IDEA.
User: windows
Date: 2021/10/29
Time: 10:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>上传</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/layui/css/layui.css">
<script src="${pageContext.request.contextPath}/layui/layui.js"></script>
<script src="${pageContext.request.contextPath}/js/jquery-3.6.0.js"></script>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/webuploader/dist/webuploader.css">
<script src="${pageContext.request.contextPath}/webuploader/dist/webuploader.js"></script>
<style>
body {
text-align: center;
padding: 20px;
}
form {
width: 500px;
margin: auto;
}
</style>
</head>
<body>
<form method="get" action="${pageContext.request.contextPath}/jdbc" enctype="multipart/form-data" class="layui-form">
<div class="layui-form-item wu-example" id="uploader">
<label class="layui-form-label"></label>
<div class="layui-input-block" >
<div id="fileList" class="uploader-list"></div>
<div id="filePicker" style="float: left">选择excel</div>
<button id="btn-submit" class="layui-btn" lay-submit lay-filter="*" style="float: right">查看excel表格</button>
</div>
</div>
</form>
<script>
$(document).ready(function () {
var uploader = WebUploader.create({
// swf文件路径
swf: '/webuploader/dist/Uploader.swf',
// 文件接收服务端。
server: '/upload',
// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick: '#filePicker',
// 最大上传并发数
thread: 1,
accept: {
title: 'excel',
extensions: 'xls'
// mimeTypes: 'image/*'
},
// 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
// resize: false,
auto :true
});
// 当有文件添加进来的时候
uploader.on( 'fileQueued', function( file ) {
var $li = $(
'<div id="' + file.id + '" class="file-item thumbnail">' +
'<img>' +
'<div class="info">' + file.name + '</div>' +
'</div>'
),
$img = $li.find('img');
$list = $('#fileList');
// $list为容器jQuery实例
$list.append( $li );
// 创建缩略图
// 如果为非图片文件,可以不用调用此方法。
// thumbnailWidth x thumbnailHeight 为 100 x 100
uploader.makeThumb( file, function( error, src ) {
if ( error ) {
$img.replaceWith('<span>不能预览</span>');
return;
}
$img.attr( 'src', src );
}, 200, 200 );
});
// 文件上传过程中创建进度条实时显示。
uploader.on( 'uploadProgress', function( file, percentage ) {
var $li = $( '#'+file.id ),
$percent = $li.find('.progress span');
// 避免重复创建
if ( !$percent.length ) {
$percent = $('<p class="progress"><span></span></p>')
.appendTo( $li )
.find('span');
}
$percent.css( 'width', percentage * 100 + '%' );
});
// 文件上传成功,给item添加成功class, 用样式标记上传成功。
uploader.on( 'uploadSuccess', function( file ) {
$( '#'+file.id ).addClass('upload-state-done');
});
// 文件上传失败,显示上传出错。
uploader.on( 'uploadError', function( file ) {
var $li = $( '#'+file.id ),
$error = $li.find('div.error');
// 避免重复创建
if ( !$error.length ) {
$error = $('<div class="error"></div>').appendTo( $li );
}
$error.text('上传失败');
});
// 完成上传完了,成功或者失败,先删除进度条。
uploader.on( 'uploadComplete', function( file ) {
$( '#'+file.id ).find('.progress').remove();
});
})
</script>
</body>
</html>
data.jsp
<%@ page import="com.alibaba.fastjson.JSON" %>
<%@ page import="top.sehnsucht.vo.Result" %>
<%@ page import="org.apache.log4j.Logger" %>
<%@ page import="top.sehnsucht.dao.ExcelDao" %>
<%@ page import="top.sehnsucht.dao.impl.ExcelDaoImpl" %>
<%@ page import="top.sehnsucht.service.ExcelService" %>
<%@ page import="top.sehnsucht.service.impl.ExcelServiceImpl" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
Logger logger = Logger.getLogger(this.getClass());
response.setHeader("Content-Type", "application/json;charset=UTF-8");//注意加上这一句
Result result = new Result();
result.setCode(0);
result.setCount(1L);
//清空session
request.getSession().getServletContext().setAttribute("allPicUrls", "");
request.getSession().getServletContext().setAttribute("allFilename", "");
ExcelDao dao = new ExcelDaoImpl();
ExcelService service = new ExcelServiceImpl(dao);
String id = request.getParameter("id");
String json = JSON.toJSONString(service.showTable());
System.out.println(json);
out.println("{\"code\":" + result.getCode() + ",\"msg\":\"\",\"count\":" + result.getCount() + ",\"data\":" + json + "}");
%>
list.jsp
<%--
Created by IntelliJ IDEA.
User: windows
Date: 2021/10/29
Time: 10:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>列表</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/layui/css/layui.css">
<script src="${pageContext.request.contextPath}/layui/layui.js"></script>
<script src="${pageContext.request.contextPath}/js/jquery-3.6.0.js"></script>
</head>
<body>
<div style="border-radius: 5px;margin-top: 100px;margin-left: 700px;margin-right: 700px">
<table id="demo" lay-filter="table-excel-filter"></table>
</div>
<script type="text/html" id="col-excel-toolbar">
<a class="layui-btn layui-btn-xs" lay-event="upload">下载</a>
</script>
<script>
layui.use(['laydate', 'table', 'form'], function () {
var table = layui.table;
table.render({
elem: '#demo'
, height: 312
, url: '/data.jsp' //数据接口
, page: false //关闭分页
, cols: [[ //表头
{
field: 'name', title: 'name', width: 300}
, {
title: '操作', align: 'center', toolbar: '#col-excel-toolbar'}
]]
});
table.on('tool(table-excel-filter)', function (obj) {
let data = obj.data;
let layEvent = obj.event;
if (layEvent === 'upload') {
console.log(data.name)
console.log("list name: " + data.name);
sessionStorage.setItem("name", data.name)
let url = '/download'
window.location.href = url + "?name=" + data.name
}
});
});
</script>
</body>
</html>