导出Excel表

115 阅读2分钟

首先导入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;
    }