菜单

因POI导出Excel数据,POI导出Excel数据

2018年12月17日 - Java

 在web开发中,有一个经典的效用,就是多少的导入导出。特别是数据的导出,在生育管理或财务系统中的不胜广阔,因为这么些网时要开有表打印的办事。这里自己概括实现导出Excel文件。

基于POI导出Excel数据,POI导出Excel数据

manbetx网页手机登录版,POI
jar包下载:http://poi.apache.org/download.html

   基于POI导出Excel数据

  以品种中汇合来过多表工作,需要导出数据。在此处我们下基于POI的计分析。POI有俩栽分析方法HSSF(xls格式)和XSSF(xlsx)。

manbetx网页手机登录版 1

章最末尾,封装了通用型的poi工具类,直接复制就可使(任意
List<实体类>)。

因BOS物流的运单管理界面也条例:

manbetx网页手机登录版 2

manbetx网页手机登录版 3

前者代码

 导出运单信息,生成报表:

  1.添加导出按钮

manbetx网页手机登录版 4

  2.添加导出事件

 manbetx网页手机登录版 5

 

后台代码实现

 POI生成Excel步骤写Excel过程一样,新建Excel文档—-新建Sheet—新建Row—新建Cell单元格—写单元格数据。

Maven导入jar包音信要列席一键上传里面的部署

Action层代码实现

manbetx网页手机登录版 6

@Controller
@Scope("prototype")
@ParentPackage("json-default")
@Namespace("/")
public class ExportXlsAction extends BaseAction<WayBill>{

    @Autowired
    private WayBillService  wayBillService;

    @Action("report_exportXls")
    public String exportXls() throws Exception{
        //查询出,满足当前条件的结果数据
        List<WayBill> waybills = wayBillService.findwayBills(model);

        // 生成Excel文件(xls格式)
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        HSSFSheet sheet = hssfWorkbook.createSheet("运单数据");//创建一个sheet对象

        // 表头(表格的第一行)
        HSSFRow headRow = sheet.createRow(0);//创建第一行对象
        headRow.createCell(0).setCellValue("运单号");//创建了第一个格子它的属性是运单号
        headRow.createCell(1).setCellValue("寄件人");//创建了第二个格子...
        headRow.createCell(2).setCellValue("寄件人电话");
        headRow.createCell(3).setCellValue("寄件人地址");
        headRow.createCell(4).setCellValue("收件人");
        headRow.createCell(5).setCellValue("收件人电话");
        headRow.createCell(6).setCellValue("收件人地址");

        // 表格数据(遍历拿到的数据,一个对象信息对应一行记录)
        for (WayBill wayBill : waybills) {//拿到最后一行的行号
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            dataRow.createCell(0).setCellValue(wayBill.getWayBillNum());
            dataRow.createCell(1).setCellValue(wayBill.getSendName());
            dataRow.createCell(2).setCellValue(wayBill.getSendMobile());
            dataRow.createCell(3).setCellValue(wayBill.getSendAddress());
            dataRow.createCell(4).setCellValue(wayBill.getRecName());
            dataRow.createCell(5).setCellValue(wayBill.getRecMobile());
            dataRow.createCell(6).setCellValue(wayBill.getRecAddress());
        }

        // 下载导出
        // 设置头信息(设置文件类型 xls)
        ServletActionContext.getResponse().setContentType(
                "application/vnd.ms-excel");
        String filename = "运单数据.xls";
        String agent = ServletActionContext.getRequest()
                .getHeader("user-agent");//得到浏览器类型(火狐,360,IE)
        filename = FileUtils .encodeDownloadFilename(filename, agent);
        ServletActionContext.getResponse().setHeader("Content-Disposition",
                "attachment;filename=" + filename);
               //filename:设置生产Excel的文件名  FileUtils:是针对浏览器类型的中文编码类
        ServletOutputStream outputStream = ServletActionContext.getResponse()
                .getOutputStream();//得到一个响应流对象
        hssfWorkbook.write(outputStream);

        // 关闭
        hssfWorkbook.close();

        return NONE;        
    }
}

Action层代码
manbetx网页手机登录版 7

package cn.itcast.bos.utils;

import java.io.IOException;
import java.net.URLEncoder;

import sun.misc.BASE64Encoder;

public class FileUtils {
        /**
         * 下载文件时,针对不同浏览器,进行附件名的编码
         * 
         * @param filename
         *            下载文件名
         * @param agent
         *            客户端浏览器
         * @return 编码后的下载附件名
         * @throws IOException
         */
        public static String encodeDownloadFilename(String filename, String agent)
                throws IOException {
            if (agent.contains("Firefox")) { // 火狐浏览器
                filename = "=?UTF-8?B?"
                        + new BASE64Encoder().encode(filename.getBytes("utf-8"))
                        + "?=";
                filename = filename.replaceAll("\r\n", "");
            } else { // IE及其他浏览器
                filename = URLEncoder.encode(filename, "utf-8");
                filename = filename.replace("+"," ");
            }
            return filename;
        }
}

FileUtils类
manbetx网页手机登录版 8

public List<WayBill> findwayBills(WayBill wayBill) {
        if (StringUtils.isBlank(wayBill.getWayBillNum())
                && StringUtils.isBlank(wayBill.getSendAddress())
                && StringUtils.isBlank(wayBill.getRecAddress())
                && StringUtils.isBlank(wayBill.getSendProNum())
                && (wayBill.getSignStatus() == null || wayBill.getSignStatus() == 0)) {
            // 无条件查询 、查询数据库
            return wayBillRepository.findAll();
        } else {
            // 查询条件
            // must 条件必须成立 and
            // must not 条件必须不成立 not
            // should 条件可以成立 or
            BoolQueryBuilder query = new BoolQueryBuilder(); // 布尔查询 ,多条件组合查询
            // 向组合查询对象添加条件
            if (StringUtils.isNoneBlank(wayBill.getWayBillNum())) {
                // 运单号查询
                QueryBuilder tempQuery = new TermQueryBuilder("wayBillNum",
                        wayBill.getWayBillNum());
                query.must(tempQuery);
            }
            if (StringUtils.isNoneBlank(wayBill.getSendAddress())) {
                //发货地的模糊查询
                //情况一:输入“北”是查询词条的一部分,使用模糊匹配词条查询
                QueryBuilder wildcardQuery = new WildcardQueryBuilder(
                        "sendAddress", "*" + wayBill.getSendAddress() + "*");

                //情况二:输入“北京市海淀区”是多个词条组合,进行分词后每个词条匹配查询
                QueryBuilder   queryStringQueryBuilder = new QueryStringQueryBuilder(wayBill.getSendAddress())
                                .field("sendAdress").defaultOperator(Operator.AND);

                //俩种情况取or关系
                BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
                boolQueryBuilder.should(queryStringQueryBuilder);
                boolQueryBuilder.should(wildcardQuery);

                query.must(boolQueryBuilder);
            }
            if (StringUtils.isNoneBlank(wayBill.getRecAddress())) {
                // 收货地 模糊查询
                QueryBuilder wildcardQuery = new WildcardQueryBuilder(
                        "recAddress", "*" + wayBill.getRecAddress() + "*");
                query.must(wildcardQuery);
            }
            if (StringUtils.isNoneBlank(wayBill.getSendProNum())) {
                // 速运类型 等值查询
                QueryBuilder termQuery = new TermQueryBuilder("sendProNum",
                        wayBill.getSendProNum());
                query.must(termQuery);
            }
            if (StringUtils.isNoneBlank(wayBill.getSendProNum())) {
                // 速运类型 等值查询
                QueryBuilder termQuery = new TermQueryBuilder("sendProNum",
                        wayBill.getSendProNum());
                query.must(termQuery);
            }
            if (wayBill.getSignStatus() != null && wayBill.getSignStatus() != 0) {
                // 签收状态查询
                QueryBuilder termQuery = new TermQueryBuilder("signStatus",
                        wayBill.getSignStatus());
                query.must(termQuery);
            }

            SearchQuery searchQuery = new NativeSearchQuery(query);
            // Integer.MAX_VALUE:方便获取所有查询到的数据
            Pageable pageable = new PageRequest(0, Integer.MAX_VALUE);
            searchQuery.setPageable(pageable ); // 分页效果
            // 有条件查询 、查询索引库
            return wayBillIndexRepository.search(searchQuery).getContent();
        }
    }

Service层代码
manbetx网页手机登录版 9

package cn.itcast.bos.dao.index;

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import cn.itcast.bos.domain.take_delivery.WayBill;
//多条件查询走的是缓存
public interface WayBillIndexRepository extends ElasticsearchRepository<WayBill, Integer> {

}

Dao层代码实现

最终兑现效益:

manbetx网页手机登录版 10

 

 因为对POI的API精晓不多,打印出的Excel数据排版是手动调整之。

 manbetx网页手机登录版 11

 

http://www.bkjia.com/Javabc/1306275.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1306275.htmlTechArticle基于POI导出Excel数据,POI导出Excel数据
基被POI导出Excel数据
在品种中会暴发众多表工作,需要导出数据。在此处我们选取基于POI的办法解析…

 

导出文件:


 

manbetx网页手机登录版 12

 



 

前端ajax异步请求代码:

$("#btn").on("click",function () {
            $.ajax("outStu",{
                type:"post",
                success:function (data) {
                    if (data==200){
                        alert("导出成功!");
                    }else {
                        alert("导出失败!");
                    }
                }
            });
        })

后台servlet代码:

/**
 * @author hh
 */
@WebServlet("/outStu")
public class StuOutServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //数据库读取学生对象列表
        List<Student> list = new StudentDao().listStudent();
        //表头
        String[] header={"编号","姓名","年龄","性别","电话","籍贯"};
        //保存文件位置+文件名(后缀一定.xls)
        String url = "/Users/mac/Documents/outStudentData/学生信息.xls";
        //调用封装的poi工具类
        int code=PoiUtil.OutExcel(list,url,header,"StudenInfo");
        //返回响应码(是否成功导出)
        resp.getWriter().print(code);
    }
}

协调包简单poi工具类代码:

/**
 * @author hh
 */
public class PoiUtil {
    /**
     * 导出Excel
     * @param list 学生对象列表
     * @param url 保存位置及文件名
     * @param headers 表头名称
     * @param title 单元表格名称
     * @return
     */
    public static int OutExcel(List<Student> list,String url,String[] headers,String title){
        int code=200;
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        //产生表格标题行
        HSSFRow row = sheet.createRow(0);
        for (short i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }
        //遍历集合数据,产生数据行
        for (int i=0;i<list.size();i++) {
            row = sheet.createRow(i+1);
            //设置行数据
            row.createCell(0).setCellValue(list.get(i).getSid());
            row.createCell(1).setCellValue(list.get(i).getSname());
            row.createCell(2).setCellValue(list.get(i).getSage());
            row.createCell(3).setCellValue(list.get(i).getSsex());
            row.createCell(4).setCellValue(list.get(i).getTel());
            row.createCell(5).setCellValue(list.get(i).getOrigin());
        }
        //定义文件输出流
        OutputStream out = null;
        try {
            out = new FileOutputStream(url);
            //写出HSSFWorkbook对象文件
            workbook.write(out);
            //刷新缓存
            out.flush();
            //关闭文件输出流
            out.close();
        } catch (IOException e) {
            code=403;
            e.printStackTrace();
        }
        return code;

    }
}

 

采用反射封装的一个通用型poi工具类:

 

    /**
     *
     * @param list 泛型集合对象
     * @param url 保存位置及文件名
     * @param headers 所有表头信息
     * @param title 单元表格名称
     * @return 响应码 200:成功 403:失败
     */
    public static int OutExcel2(List<?> list,String url,String[] headers,String title){
        int code=200;
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        //产生表格标题行
        HSSFRow row = sheet.createRow(0);
        //遍历写入表头信息
        for (short i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }
        //遍历集合数据,产生数据行
        for (int i=0;i<list.size();i++) {
            //因为表头占据了一行所以这里i+1
            row = sheet.createRow(i+1);
            //获取所有字段对象 包括私有
            Field[] fields=list.get(i).getClass().getDeclaredFields();
            //遍历所有字段对象
            for (int j = 0; j < fields.length; j++) {
                //定义存放值 的变量
                Object value= null;
                try {
                    //打开访问开关
                    fields[j].setAccessible(true);
                    //获取字段的值
                    value = fields[j].get(list.get(i));
                } catch (IllegalAccessException e) {
                    code=403;
                    e.printStackTrace();
                }
                //获取的值写入到单元格中(我在这里直接toString了,如果规范一点需要类型判断、转换)
                row.createCell(j).setCellValue(value.toString());
            }
        }
        //定义文件输出流
        OutputStream out = null;
        try {
            out = new FileOutputStream(url);
            //写出HSSFWorkbook对象文件
            workbook.write(out);
            //刷新缓存
            out.flush();
            //关闭文件输出流
            out.close();
        } catch (IOException e) {
            code=403;
            e.printStackTrace();
        }
        return code;

    }

 

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图