首先导入pio包:
<!--导excel到数据库 -->
<!--POM 包-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
controller层:
serviceImp:
/**
* 下载excel
*/
@Override
public List<SchoolTask> findAll() throws Exception {
HSSFWorkbook hwb = new HSSFWorkbook();//第一步,创建一个workbook(一个excel文件)
HSSFSheet hs = hwb.createSheet("图书详情信息");//第二步,在workbook中添加一个sheet,对应excel文件中sheet
HSSFRow hr = hs.createRow((int)0);//第三部,在sheet中添加表头第0行(相当于解释字段)
HSSFCellStyle hcs = hwb.createCellStyle();//第四步,设置第0行(表头)居中
hcs.setAlignment(HSSFCellStyle.ALIGN_CENTER);//创建居中格式
//将表头的字段放入数组当中
List<String> questionName=schoolTaskDao.selectQuestionName();
String[] excelHeader=new String[9];
excelHeader[0]="学校名称";
int add=1;
for(String qn:questionName) {
excelHeader[add]=qn;
add++;
}
for (int i = 0; i < excelHeader.length; i++) {
HSSFCell hc = hr.createCell(i);//顺序创建
hc.setCellValue(excelHeader[i]);//顺序塞入
hc.setCellStyle(hcs);//居中
hs.autoSizeColumn(i);//设置 i 这一列为自动调整列宽
}
List<SchoolTask> list = schoolTaskDao.findAll();//查找全部实体属性字段
String sname = "";
int j = 0;
int row = 0;
for (int i = 0; i < list.size(); i++) {
if(!list.get(i).getSchoolName().equals(sname)) {
row ++;
hr = hs.createRow(row); //在sheet中自动随 i+1 增加一行(i 是表头)
hr.createCell(0).setCellValue(list.get(i).getSchoolName());
sname = list.get(i).getSchoolName();
j = 0;
}
j ++;
hr.createCell(j).setCellValue(list.get(i).getTask());
}
String subjectName="";
for(SchoolTask li:list) {
subjectName=li.getSubjectName();
}
subjectName=subjectName+".xls";
FileOutputStream fos = new FileOutputStream("E:/"+subjectName);//先 new 出文件存放的位置
hwb.write(fos);;//写入
fos.close();//关闭资源
System.out.println("导出成功! 无任何异常。");
return list;
}
dao层:
Mapper里代码:
代码有瑕疵,但是导出成excel是没有问题的,导出和导入一样,完全copy是行不通的,要理解,根据自己的需求来导。。。。
导出到网页(设置response):
Workbook wb=loadExcelService.downloadSubject();
// 设置response参数,可以打开下载页面
response.reset();
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode("总分.xlsx", "utf-8"));
//FileOutputStream fos = new FileOutputStream("E:/总分.xlsx");先 new 出文件存放的位置
OutputStream fos=response.getOutputStream();
wb.write(fos);;//写入
fos.close();//关闭资源
@RequestMapping(value = "/file", method = RequestMethod.POST)
@ResponseBody
public boolean upload(@RequestParam(value = "file", required = false) MultipartFile file,
HttpServletRequest request, HttpServletResponse response) throws IOException {
//写入txt文本
FileWriter fileWriter = null;
//创建文本文件
fileWriter = new FileWriter("/Users/keying/Downloads/key.txt");
boolean a = false;
String fileName = file.getOriginalFilename();
try {
InputStream is = file.getInputStream();
Workbook wb = new XSSFWorkbook(is);
//创建工作簿
//创建表
Sheet sheet = wb.getSheetAt(0);
//a = schoolTaskService.batchImport(fileName, file);
//得到表的最后行数(总行数)
int totalRows = sheet.getLastRowNum();
List<String> userList = new ArrayList<String>();
String[] strs = new String[8];
//得到表下标为0的第一行
Row rowtitle = sheet.getRow(0);
//得到表的总列数
System.out.println(rowtitle.getLastCellNum());
for (int y = 1; y < rowtitle.getLastCellNum(); y++) {
//把标题放进数组
strs[y - 1] = getValue(rowtitle.getCell(y));
}
String subjectName = fileName.substring(0, fileName.lastIndexOf("."));
for (int r = 1; r <= totalRows; r++) {
Row row = sheet.getRow(r);
if (row == null) {
continue;
}
//得到下标为0的第一列的所有值
String number = getValue(row.getCell(0));
String newTest = test.replace("\"lecturerId\":\"37211\"", "\"lecturerId\":\"" + number + "\"");
System.out.println(newTest);
//写入 \r\n换行
fileWriter.write(newTest + "\r\n"+"\r\n");
}
System.out.println("一共:" + totalRows + "条数据!");
fileWriter.flush();
fileWriter.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return a;
}
private String getValue(Cell cell) {
String value = "";
switch (cell.getCellType()) {
// 数字
case Cell.CELL_TYPE_NUMERIC:
//如果为时间格式的内容
if (HSSFDateUtil.isCellDateFormatted(cell)) {
//注:format格式 yyyy-MM-dd hh:mm:ss 中小时为12小时制,若要24小时制,则把小h变为H即可,yyyy-MM-dd HH:mm:ss
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
value = sdf.format(HSSFDateUtil.getJavaDate(cell.
getNumericCellValue())).toString();
break;
} else {
value = new DecimalFormat("0").format(cell.getNumericCellValue());
}
break;
// 字符串
case Cell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
// Boolean
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue() + "";
break;
// 公式
case Cell.CELL_TYPE_FORMULA:
value = cell.getCellFormula() + "";
break;
// 空值
case Cell.CELL_TYPE_BLANK:
value = "";
break;
// 故障
case Cell.CELL_TYPE_ERROR:
value = "非法字符";
break;
default:
value = "未知类型";
break;
}
return value;
}