【问题标题】:AbstractExcelView is deprecated in Spring-based applicationAbstractExcelView 在基于 Spring 的应用程序中已弃用
【发布时间】:2016-06-23 06:36:46
【问题描述】:

我想在我的基于 Spring-Boot 的应用程序中实现将数据导出到 Excel 文件。

当我打算使用AbstractExcelView 时,但我知道AbstractExcelView 已被弃用。导出 Excel 文件的替代解决方案是什么?

【问题讨论】:

    标签: java spring spring-mvc spring-boot export-to-excel


    【解决方案1】:

    从 Spring 4.2 开始,您可以尝试 AbstractXlsView 及其 AbstractXlsxViewAbstractXlsxStreamingView 变体,而不是 AbstractExcelView

    下面给出一个例子

        import com.example.Course;
        import org.apache.poi.ss.usermodel.Row;
        import org.apache.poi.ss.usermodel.Sheet;
        import org.springframework.web.servlet.view.document.AbstractXlsView;
        import org.apache.poi.ss.usermodel.Workbook;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.text.DateFormat;
        import java.util.List;
        import java.util.Map;
    
        public class XlsView extends AbstractXlsView {
    
            private static final DateFormat DATE_FORMAT = DateFormat.getDateInstance(DateFormat.SHORT);
    
            @Override
            protected void buildExcelDocument(Map<String, Object> model,
                                              Workbook workbook,
                                              HttpServletRequest request,
                                              HttpServletResponse response) throws Exception {
    
                // change the file name
                response.setHeader("Content-Disposition", "attachment; filename=\"my-xls-file.xls\"");
    
                @SuppressWarnings("unchecked")
                List<Course> courses = (List<Course>) model.get("courses");
    
                // create excel xls sheet
                Sheet sheet = workbook.createSheet("Spring MVC AbstractXlsView");
    
                // create header row
                Row header = sheet.createRow(0);
                header.createCell(0).setCellValue("ID");
                header.createCell(1).setCellValue("Name");
                header.createCell(2).setCellValue("Date");
    
                // Create data cells
                int rowCount = 1;
                for (Course course : courses){
                    Row courseRow = sheet.createRow(rowCount++);
                    courseRow.createCell(0).setCellValue(course.getId());
                    courseRow.createCell(1).setCellValue(course.getName());
                    courseRow.createCell(2).setCellValue(DATE_FORMAT.format(course.getDate()));
                }
            }
        }
    

    另一个例子

    import com.example.Course;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.springframework.web.servlet.view.document.AbstractXlsxStreamingView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.text.DateFormat;
    import java.util.List;
    import java.util.Map;
    
    public class XlsxStreamingView extends AbstractXlsxStreamingView {
    
        private static final DateFormat DATE_FORMAT = DateFormat.getDateInstance(DateFormat.SHORT);
    
        @Override
        protected void buildExcelDocument(Map<String, Object> model,
                                          Workbook workbook, HttpServletRequest request,
                                          HttpServletResponse response) throws Exception {
            // change the file name
            response.setHeader("Content-Disposition", "attachment; filename=\"my-xlsxStreaming-file.xlsx\"");
    
            @SuppressWarnings("unchecked")
            List<Course> courses = (List<Course>) model.get("courses");
    
            // create excel xls sheet
            Sheet sheet = workbook.createSheet("Spring MVC AbstractXlsxStreamingView");
    
            // create header row
            Row header = sheet.createRow(0);
            header.createCell(0).setCellValue("ID");
            header.createCell(1).setCellValue("Name");
            header.createCell(2).setCellValue("Date");
    
            // Create data cells
            int rowCount = 1;
            for (Course course : courses){
                Row courseRow = sheet.createRow(rowCount++);
                courseRow.createCell(0).setCellValue(course.getId());
                courseRow.createCell(1).setCellValue(course.getName());
                courseRow.createCell(2).setCellValue(DATE_FORMAT.format(course.getDate()));
            }
        }
    }
    

    【讨论】:

    • 感谢 Mudassar,帮了大忙 :)
    • 示例代码有效吗?我看不到任何数据通过响应发送到哪里(例如,没有调用 getOutputStream)。
    • 没有 servlet?
    【解决方案2】:

    我想完成这个例子,让它从头开始运行:

    将以下内容添加到您的 Spring MVC 项目中。

    文件:src/views.properties

    excelView2.(class)=YourPackageName.XlsxStreamingView
    


    文件:WEB-INF/your_Spring_Config.xml
    参考“views.properties”添加一个“ResourceBundleViewResolver”

    <bean id="viewResolver1" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
     <property name="order" value="1" />
     <property name="basename" value="views" />
    </bean>
    <bean id="viewResolver2"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="order" value="2" />
     <property name="prefix" value="/WEB-INF/view/" />
     <property name="suffix" value=".jsp" />
    </bean>
    

    文件:src/YourPackageName/Course.java

    public class Course {
     int Id;
     String Name;
     Date Date;
     .. getter and setter
    }
    

    文件:src/YourPackageName/MyController.java

    package YourPackageName.MyController;
    @Controller
    @RequestMapping("/example")
    public class CustomerController {
    ...
        @GetMapping("downloadExcel")
        public ModelAndView downloadExcel() {
            System.out.println("inside downloadExcel");
            // create some sample data
    
            List<Course> listCourses = new ArrayList<Course>();
            listCourses.add(new Course(1, "Polarfrosch100", new Date()));
            listCourses.add(new Course(2, "Polarfrosch101", new Date()));
            listCourses.add(new Course(3, "Polarfrosch102", new Date()));
    
            // return a view which will be resolved by an excel view resolver
            return new ModelAndView("excelView2", "courses", listCourses);
        }
    }
    

    文件:WEB-INF/view/your.jsp

    ...
    <a href="${pageContext.request.contextPath}/example/downloadExcel">Download Excel Document</a>
    

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 2020-01-30
      • 1970-01-01
      • 2014-02-02
      • 2016-10-30
      • 2012-01-04
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多