准备工作:
导入POI对应的Jar包
1 <dependency>
2 <groupId>org.apache.poi</groupId>
3 <artifactId>poi-ooxml</artifactId>
4 <version>3.14-beta1</version>
5 </dependency>
6 <dependency>
7 <groupId>org.apache.poi</groupId>
8 <artifactId>poi-ooxml-schemas</artifactId>
9 <version>3.14-beta1</version>
10 </dependency>
11 <dependency>
12 <groupId>org.apache.poi</groupId>
13 <artifactId>poi</artifactId>
14 <version>3.14-beta1</version>
15 </dependency>
16 <dependency>
17 <groupId>org.apache.httpcomponents</groupId>
18 <artifactId>httpclient</artifactId>
19 <version>4.5.2</version>
20 </dependency>
创建一个ExcelBean实现对数据的封装
1 package com.website.system.utils;
2
3 import org.apache.poi.xssf.usermodel.XSSFCellStyle;
4
5 public class ExcelBean implements java.io.Serializable {
6 private String headTextName; //列头(标题)名
7 private String propertyName; //对应字段名
8 private Integer cols; //合并单元格数
9 private XSSFCellStyle cellStyle;
10 public ExcelBean(){
11 }
12 public ExcelBean(String headTextName, String propertyName){
13 this.headTextName = headTextName;
14 this.propertyName = propertyName;
15 }
16 public ExcelBean(String headTextName, String propertyName, Integer cols) {
17 super();
18 this.headTextName = headTextName;
19 this.propertyName = propertyName;
20 this.cols = cols;
21 }
22
23 public String getHeadTextName() {
24 return headTextName;
25 }
26
27 public void setHeadTextName(String headTextName) {
28 this.headTextName = headTextName;
29 }
30
31 public String getPropertyName() {
32 return propertyName;
33 }
34
35 public void setPropertyName(String propertyName) {
36 this.propertyName = propertyName;
37 }
38
39 public Integer getCols() {
40 return cols;
41 }
42
43 public void setCols(Integer cols) {
44 this.cols = cols;
45 }
46
47 public XSSFCellStyle getCellStyle() {
48 return cellStyle;
49 }
50
51 public void setCellStyle(XSSFCellStyle cellStyle) {
52 this.cellStyle = cellStyle;
53 }
54 }
创建一个Excel导入导出工具类ExcelUtil
1 package com.website.system.utils;
2 import org.apache.http.client.utils.DateUtils;
3 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
4 import org.apache.poi.ss.usermodel.Cell;
5 import org.apache.poi.ss.usermodel.Row;
6 import org.apache.poi.ss.usermodel.Sheet;
7 import org.apache.poi.ss.usermodel.Workbook;
8 import org.apache.poi.ss.util.CellRangeAddress;
9 import org.apache.poi.xssf.usermodel.*;
10
11 import java.beans.IntrospectionException;
12 import java.beans.PropertyDescriptor;
13 import java.io.*;
14 import java.lang.reflect.InvocationTargetException;
15 import java.lang.reflect.Method;
16 import java.math.BigDecimal;
17 import java.text.DecimalFormat;
18 import java.text.NumberFormat;
19 import java.text.ParseException;
20 import java.text.SimpleDateFormat;
21 import java.util.ArrayList;
22 import java.util.Date;
23 import java.util.List;
24 import java.util.Map;
25
26 public class ExcelUtil {
27 private final static String excel2003L =".xls"; //2003- 版本的excel
28 private final static String excel2007U =".xlsx"; //2007+ 版本的excel
29 /**
30 * Excel导入
31 */
32 public static List<List<Object>> getBankListByExcel(InputStream in, String fileName) throws Exception{
33 List<List<Object>> list = null;
34 //创建Excel工作薄
35 Workbook work = getWorkbook(in,fileName);
36 if(null == work){
37 throw new Exception("创建Excel工作薄为空!");
38 }
39 Sheet sheet = null;
40 Row row = null;
41 Cell cell = null;
42 list = new ArrayList<List<Object>>();
43 //遍历Excel中所有的sheet
44 for (int i = 0; i < work.getNumberOfSheets(); i++) {
45 sheet = work.getSheetAt(i);
46 if(sheet==null){continue;}
47 //遍历当前sheet中的所有行
48 //包涵头部,所以要小于等于最后一列数,这里也可以在初始值加上头部行数,以便跳过头部
49 for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
50 //读取一行
51 row = sheet.getRow(j);
52 //去掉空行和表头
53 if(row==null||row.getFirstCellNum()==j){continue;}
54 //遍历所有的列
55 List<Object> li = new ArrayList<Object>();
56 for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
57 cell = row.getCell(y);
58 li.add(getCellValue(cell));
59 }
60 list.add(li);
61 }
62 }
63 return list;
64 }
65
66 private static Workbook getWorkbook(InputStream inStr,String fileName) throws Exception {
67 Workbook wb = null;
68 String fileType = fileName.substring(fileName.lastIndexOf("."));
69 if(excel2003L.equals(fileType)){
70 wb = new HSSFWorkbook(inStr); //2003-
71 }else if(excel2007U.equals(fileType)){
72 wb = new XSSFWorkbook(inStr); //2007+
73 }else{
74 throw new Exception("解析的文件格式有误!");
75 }
76 return wb;
77 }
78 /**
79 * 描述:对表格中数值进行格式化
80 */
81 public static Object getCellValue(Cell cell){
82 Object value = null;
83 DecimalFormat df = new DecimalFormat("0"); //格式化字符类型的数字
84 SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); //日期格式化
85 DecimalFormat df2 = new DecimalFormat("0.00"); //格式化数字
86 switch (cell.getCellType()) {
87 case Cell.CELL_TYPE_STRING:
88 value = cell.getRichStringCellValue().getString();
89 break;
90 case Cell.CELL_TYPE_NUMERIC:
91 if("General".equals(cell.getCellStyle().getDataFormatString())){
92 value = df.format(cell.getNumericCellValue());
93 }else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){
94 value = sdf.format(cell.getDateCellValue());
95 }else{
96 value = df2.format(cell.getNumericCellValue());
97 }
98 break;
99 case Cell.CELL_TYPE_BOOLEAN:
100 value = cell.getBooleanCellValue();
101 break;
102 case Cell.CELL_TYPE_BLANK:
103 value = "";
104 break;
105 default:
106 break;
107 }
108 return value;
109 }
110
111 /**
112 * 导入Excel表结束
113 * 导出Excel表开始
114 * @param sheetName 工作簿名称
115 * @param clazz 数据源model类型
116 * @param objs excel标题列以及对应model字段名
117 * @param map 标题列行数以及cell字体样式
118 */
119 public static XSSFWorkbook createExcelFile(Class clazz, List objs, Map<Integer, List<ExcelBean>> map, String sheetName) throws
120 IllegalArgumentException,IllegalAccessException, InvocationTargetException,
121 ClassNotFoundException, IntrospectionException, ParseException {
122 // 创建新的Excel工作簿
123 XSSFWorkbook workbook = new XSSFWorkbook();
124 // 在Excel工作簿中建一工作表,其名为缺省值, 也可以指定Sheet名称
125 XSSFSheet sheet = workbook.createSheet(sheetName);
126 // 以下为excel的字体样式以及excel的标题与内容的创建,下面会具体分析;
127 createFont(workbook); //字体样式
128 createTableHeader(sheet, map); //创建标题(头)
129 createTableRows(sheet, map, objs, clazz); //创建内容
130 return workbook;
131 }
132 private static XSSFCellStyle fontStyle;
133 private static XSSFCellStyle fontStyle2;
134 public static void createFont(XSSFWorkbook workbook) {
135 // 表头
136 fontStyle = workbook.createCellStyle();
137 XSSFFont font1 = workbook.createFont();
138 font1.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
139 font1.setFontName("黑体");
140 font1.setFontHeightInPoints((short) 14);// 设置字体大小
141 fontStyle.setFont(font1);
142 fontStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); // 下边框
143 fontStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
144 fontStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
145 fontStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
146 fontStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中
147 // 内容
148 fontStyle2=workbook.createCellStyle();
149 XSSFFont font2 = workbook.createFont();
150 font2.setFontName("宋体");
151 font2.setFontHeightInPoints((short) 10);// 设置字体大小
152 fontStyle2.setFont(font2);
153 fontStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN); // 下边框
154 fontStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
155 fontStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
156 fontStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
157 fontStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中
158 }
159
160 /**
161 * 根据ExcelMapping 生成列头(多行列头)
162 *
163 * @param sheet 工作簿
164 * @param map 每行每个单元格对应的列头信息
165 */
166 public static final void createTableHeader(XSSFSheet sheet, Map<Integer, List<ExcelBean>> map) {
167 int startIndex=0;//cell起始位置
168 int endIndex=0;//cell终止位置
169 for (Map.Entry<Integer, List<ExcelBean>> entry : map.entrySet()) {
170 XSSFRow row = sheet.createRow(entry.getKey());
171 List<ExcelBean> excels = entry.getValue();
172 for (int x = 0; x < excels.size(); x++) {
173 //合并单元格
174 if(excels.get(x).getCols()>1){
175 if(x==0){
176 endIndex+=excels.get(x).getCols()-1;
177 CellRangeAddress range=new CellRangeAddress(0,0,startIndex,endIndex);
178 sheet.addMergedRegion(range);
179 startIndex+=excels.get(x).getCols();
180 }else{
181 endIndex+=excels.get(x).getCols();
182 CellRangeAddress range=new CellRangeAddress(0,0,startIndex,endIndex);
183 sheet.addMergedRegion(range);
184 startIndex+=excels.get(x).getCols();
185 }
186 XSSFCell cell = row.createCell(startIndex-excels.get(x).getCols());
187 cell.setCellValue(excels.get(x).getHeadTextName());// 设置内容
188 if (excels.get(x).getCellStyle() != null) {
189 cell.setCellStyle(excels.get(x).getCellStyle());// 设置格式
190 }
191 cell.setCellStyle(fontStyle);
192 }else{
193 XSSFCell cell = row.createCell(x);
194 cell.setCellValue(excels.get(x).getHeadTextName());// 设置内容
195 if (excels.get(x).getCellStyle() != null) {
196 cell.setCellStyle(excels.get(x).getCellStyle());// 设置格式
197 }
198 cell.setCellStyle(fontStyle);
199 }
200 }
201 }
202 }
203 public static void createTableRows(XSSFSheet sheet, Map<Integer, List<ExcelBean>> map, List objs, Class clazz)
204 throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException,
205 ClassNotFoundException, ParseException {
206 int rowindex = map.size();
207 int maxKey = 0;
208 List<ExcelBean> ems = new ArrayList<>();
209 for (Map.Entry<Integer, List<ExcelBean>> entry : map.entrySet()) {
210 if (entry.getKey() > maxKey) {
211 maxKey = entry.getKey();
212 }
213 }
214 ems = map.get(maxKey);
215 List<Integer> widths = new ArrayList<Integer>(ems.size());
216 for (Object obj : objs) {
217 XSSFRow row = sheet.createRow(rowindex);
218 for (int i = 0; i < ems.size(); i++) {
219 ExcelBean em = (ExcelBean) ems.get(i);
220 // 获得get方法
221 PropertyDescriptor pd = new PropertyDescriptor(em.getPropertyName(), clazz);
222 Method getMethod = pd.getReadMethod();
223 Object rtn = getMethod.invoke(obj);
224 String value = "";
225 // 如果是日期类型进行转换
226 if (rtn != null) {
227 if (rtn instanceof Date) {
228 value = DateUtils.formatDate((Date)rtn,"yyyy-MM-dd");
229 } else if(rtn instanceof BigDecimal){
230 NumberFormat nf = new DecimalFormat("#,##0.00");
231 value=nf.format((BigDecimal)rtn).toString();
232 } else if((rtn instanceof Integer) && (Integer.valueOf(rtn.toString())<0 )){
233 value="--";
234 }else {
235 value = rtn.toString();
236 }
237 }
238 XSSFCell cell = row.createCell(i);
239 cell.setCellValue(value);
240 cell.setCellType(XSSFCell.CELL_TYPE_STRING);
241 cell.setCellStyle(fontStyle2);
242 // 获得最大列宽
243 int width = value.getBytes().length * 300;
244 // 还未设置,设置当前
245 if (widths.size() <= i) {
246 widths.add(width);
247 continue;
248 }
249 // 比原来大,更新数据
250 if (width > widths.get(i)) {
251 widths.set(i, width);
252 }
253 }
254 rowindex++;
255 }
256 // 设置列宽
257 for (int index = 0; index < widths.size(); index++) {
258 Integer width = widths.get(index);
259 width = width < 2500 ? 2500 : width + 300;
260 width = width > 10000 ? 10000 + 300 : width + 300;
261 sheet.setColumnWidth(index, width);
262 }
263 }
264 }
实体类
1 package com.website.system.model;
2
3 public class Studentdb {
4 private Integer studentid;
5 private Integer classid;
6 private String name;
7 private Integer age;
8 private String city;
9 private Integer score;
10
11 public Integer getStudentid() {
12 return studentid;
13 }
14
15 public void setStudentid(Integer studentid) {
16 this.studentid = studentid;
17 }
18
19 public Integer getClassid() {
20 return classid;
21 }
22
23 public void setClassid(Integer classid) {
24 this.classid = classid;
25 }
26
27 public String getName() {
28 return name;
29 }
30
31 public void setName(String name) {
32 this.name = name;
33 }
34
35 public Integer getAge() {
36 return age;
37 }
38
39 public void setAge(Integer age) {
40 this.age = age;
41 }
42
43 public String getCity() {
44 return city;
45 }
46
47 public void setCity(String city) {
48 this.city = city;
49 }
50
51 public Integer getScore() {
52 return score;
53 }
54
55 public void setScore(Integer score) {
56 this.score = score;
57 }
58
59 @Override
60 public String toString() {
61 return "Studentdb{" +
62 "studentid=" + studentid +
63 ", classid=" + classid +
64 ", name='" + name + '\'' +
65 ", age=" + age +
66 ", city='" + city + '\'' +
67 ", score=" + score +
68 '}';
69 }
70 }
dao数据访问层
1 public interface StudentdbMapper {
2 boolean insertdb(List<Studentdb> list);
3 }
mapper sql语句
1 <mapper namespace="com.website.system.dao.StudentdbMapper">
2 <insert id="insertdb" parameterType="java.util.List">
3 insert into studentdb (studentid,classid, name,age, city, score)
4 values
5 <foreach collection="list" item="item" index="index" separator=",">
6 (#{item.studentid}, #{item.classid}, #{item.name},#{item.age}, #{item.city},
7 #{item.score})
8 </foreach>
9 </insert>
10 </mapper>
Service
1 public interface StudentdbService {
2 void insertdb(InputStream in, MultipartFile file) throws Exception;
3 //boolean insertdb(Studentdb studentdb);
4 }
ServiceImpl
1 @Service
2 public class StudentServiceImpl implements StudentdbService {
3 @Resource
4 private StudentdbMapper studentdbMapper;
5
6 /*@Override
7 public boolean insertdb(Studentdb studentdb) {
8 return studentdbMapper.insertdb(studentdb);
9 }*/
10
11 @Override
12 public void insertdb(InputStream in, MultipartFile file)throws Exception {
13 System.out.println(file.getOriginalFilename());
14 List<List<Object>> listob = ExcelUtil.getBankListByExcel(in,file.getOriginalFilename());
15 List<Studentdb> salaryList = new ArrayList<Studentdb>();
16 //遍历listob数据,把数据放到List中
17 for (int i = 0; i < listob.size(); i++) {
18 List<Object> ob = listob.get(i);
19 Studentdb studentdb = new Studentdb();
20 //设置编号
21 // studentdb.setSerial(SerialUtil.salarySerial());
22 //通过遍历实现把每一列封装成一个model中,再把所有的model用List集合装载
23 //studentdb.setAdminId(adminId);
24 int studentid=Integer.parseInt(String.valueOf(ob.get(0)));
25 int classid=Integer.parseInt(String.valueOf(ob.get(1)));
26 int age=Integer.parseInt(String.valueOf(ob.get(3)));
27 int score=Integer.parseInt(String.valueOf(ob.get(5)));
28 studentdb.setStudentid(studentid);
29 studentdb.setClassid(classid);
30 studentdb.setName(String.valueOf(ob.get(2)));
31 studentdb.setAge(age);
32 studentdb.setCity(String.valueOf(ob.get(4)));
33 studentdb.setScore(score);
34 /* salarymanage.setBankCard(String.valueOf(ob.get(6)));
35 salarymanage.setBank(String.valueOf(ob.get(7)));
36 //object类型转Double类型
37 salarymanage.setMoney(Double.parseDouble(ob.get(8).toString()));
38 salarymanage.setRemark(String.valueOf(ob.get(9)));
39 salarymanage.setSalaryDate(salaryDate);*/
40 salaryList.add(studentdb);
41 }
42 //批量插入
43 studentdbMapper.insertdb(salaryList);
44 //salarymanageDao.insertInfoBatch(salaryList);
45 }
46 }
controller
1 @Controller
2 public class StudentdbController {
3
4 @Resource
5 private StudentdbService StudentdbService;
6 @RequestMapping("/import")
7 public String impotr(HttpServletRequest request) throws Exception {
8 //获取上传的文件
9 MultipartHttpServletRequest multipart = (MultipartHttpServletRequest) request;
10 MultipartFile file = multipart.getFile("file");
11 String filename = request.getParameter("filename");
12 InputStream in = file.getInputStream();
13 System.out.println(filename);
14 //数据导入
15 StudentdbService.insertdb(in,file);
16 in.close();
17 return "true";
18 }
19
20 }
html页面和js
1 <script>
2 function uploadPic() {
3 var form = document.getElementById('upload'),
4 formData = new FormData(form);
5 $.ajax({
6 url:"/import",
7 type:"post",
8 data:formData,
9 processData:false,
10 contentType:false,
11 success:function(res){
12 if(res){
13 alert("上传成功!");
14 }
15 console.log(res);
16 $("#file").val("");
17 $(".showUrl").html(res);
18 $(".showPic").attr("src",res);
19 },
20 error:function(err){
21 alert("网络连接失败,稍后重试",err);
22 }
23
24 })
25
26 }
27 </script>
28 <body>
29 <form id="upload" enctype="multipart/form-data" method="post">
30 <input type="file" name="file" id="file"/>
31 <input type="button" value="提交" οnclick="uploadPic();"/>
32 <span class="showUrl"></span>
33 <img src="" class="showPic" alt="">
34 </form>
35 </body>
导出:
Excel导出Controller端实现
1 @RequestMapping("/export")
2 public @ResponseBody void export(HttpServletRequest request, HttpServletResponse response) throwsClassNotFoundException, IntrospectionException, IllegalAccessException, ParseException, InvocationTargetException {
3 String salaryDate = request.getParameter("salaryDate");//获取前端的查询条件
4 if(salaryDate!=""){
5 response.reset(); //清除buffer缓存
6 Map<String,Object> map=new HashMap<String,Object>();
7 // 指定下载的文件名,浏览器都会使用本地编码,即GBK,浏览器收到这个文件名后,用ISO-8859-1来解码,然后用GBK来显示
8 // 所以我们用GBK解码,ISO-8859-1来编码,在浏览器那边会反过来执行。
9 response.setHeader("Content-Disposition", "attachment;filename=" + new String(salaryDate.getBytes("GBK"),"ISO-8859-1"));
10 response.setContentType("application/vnd.ms-excel;charset=UTF-8");
11 response.setHeader("Pragma", "no-cache");
12 response.setHeader("Cache-Control", "no-cache");
13 response.setDateHeader("Expires", 0);
14 XSSFWorkbook workbook=null;
15 //导出Excel对象
16 workbook = salaryService.exportExcelInfo(salaryDate);
17 OutputStream output;
18 try {
19 output = response.getOutputStream();
20 BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
21 bufferedOutPut.flush();
22 workbook.write(bufferedOutPut);
23 bufferedOutPut.close();
24 } catch (IOException e) {
25 e.printStackTrace();
26 }
27 }
28 }
Service层,这里是exportExcelInfo的实现方法
1 public XSSFWorkbook exportExcelInfo(String salaryDate) throws InvocationTargetException, ClassNotFoundException, IntrospectionException, ParseException, IllegalAccessException {
2 //根据条件查询数据,把数据装载到一个list中
3 List<Salarymanage> list = salarymanageDao.selectApartInfo(salaryDate);
4 for(int i=0;i<list.size();i++){
5 //查询财务名字
6 int adminId = list.get(i).getAdminId();
7 String adminName = salarymanageDao.selectAdminNameById(adminId);
8 list.get(i).setAdminName(adminName);
9 list.get(i).setId(i+1);
10 }
11 List<ExcelBean> excel=new ArrayList<>();
12 Map<Integer,List<ExcelBean>> map=new LinkedHashMap<>();
13 XSSFWorkbook xssfWorkbook=null;
14 //设置标题栏
15 excel.add(new ExcelBean("序号","id",0));
16 excel.add(new ExcelBean("厂名","company",0));
17 excel.add(new ExcelBean("工号","number",0));
18 excel.add(new ExcelBean("姓名","name",0));
19 excel.add(new ExcelBean("性别","sex",0));
20 excel.add(new ExcelBean("开户名","cardName",0));
21 excel.add(new ExcelBean("银行卡号","bankCard",0));
22 excel.add(new ExcelBean("开户行","bank",0));
23 excel.add(new ExcelBean("金额","money",0));
24 excel.add(new ExcelBean("备注","remark",0));
25 map.put(0, excel);
26 String sheetName = salaryDate + "月份收入";
27 //调用ExcelUtil的方法
28 xssfWorkbook = ExcelUtil.createExcelFile(Salarymanage.class, list, map, sheetName);
29 return xssfWorkbook;
30 }