model, HttpServletRequest request, HttpServletResponse response) throws Exception {
32 |
33 | // IE workaround: write into byte array first.
34 | ByteArrayOutputStream baos = createTemporaryOutputStream();
35 |
36 | // Apply preferences and build metadata.
37 | Document document = new Document(PageSize.A4.rotate(), 36, 36, 54, 36);
38 | PdfWriter writer = PdfWriter.getInstance(document, baos);
39 | prepareWriter(model, writer, request);
40 | buildPdfMetadata(model, document, request);
41 |
42 | // Build PDF document.
43 | document.open();
44 | buildPdfDocument(model, document, writer, request, response);
45 | document.close();
46 |
47 | // Flush to HTTP response.
48 | writeToResponse(response, baos);
49 | }
50 |
51 | /**
52 | * Prepare the given PdfWriter. Called before building the PDF document,
53 | * that is, before the call to {@code Document.open()}.
54 | * Useful for registering a page event listener, for example.
55 | * The default implementation sets the viewer preferences as returned
56 | * by this class's {@code getViewerPreferences()} method.
57 | * @param model the model, in case meta information must be populated from it
58 | * @param writer the PdfWriter to prepare
59 | * @param request in case we need locale etc. Shouldn't look at attributes.
60 | * @throws DocumentException if thrown during writer preparation
61 | */
62 | protected void prepareWriter(Map model, PdfWriter writer, HttpServletRequest request) throws DocumentException {
63 | writer.setViewerPreferences(getViewerPreferences());
64 | }
65 |
66 | /**
67 | * Return the viewer preferences for the PDF file.
68 | * By default returns {@code AllowPrinting} and
69 | * {@code PageLayoutSinglePage}, but can be subclassed.
70 | * The subclass can either have fixed preferences or retrieve
71 | * them from bean properties defined on the View.
72 | * @return an int containing the bits information against PdfWriter definitions
73 | */
74 | protected int getViewerPreferences() {
75 | return PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage;
76 | }
77 |
78 | /**
79 | * Populate the iText Document's meta fields (author, title, etc.).
80 | *
Default is an empty implementation. Subclasses may override this method
81 | * to add meta fields such as title, subject, author, creator, keywords, etc.
82 | * This method is called after assigning a PdfWriter to the Document and
83 | * before calling {@code document.open()}.
84 | * @param model the model, in case meta information must be populated from it
85 | * @param document the iText document being populated
86 | * @param request in case we need locale etc. Shouldn't look at attributes.
87 | */
88 | protected void buildPdfMetadata(Map model, Document document, HttpServletRequest request) {
89 | }
90 |
91 | /**
92 | * Subclasses must implement this method to build an iText PDF document,
93 | * given the model. Called between {@code Document.open()} and
94 | * {@code Document.close()} calls.
95 | * Note that the passed-in HTTP response is just supposed to be used
96 | * for setting cookies or other HTTP headers. The built PDF document itself
97 | * will automatically get written to the response after this method returns.
98 | * @param model the model Map
99 | * @param document the iText Document to add elements to
100 | * @param writer the PdfWriter to use
101 | * @param request in case we need locale etc. Shouldn't look at attributes.
102 | * @param response in case we need to set cookies. Shouldn't write to it.
103 | * @throws Exception any exception that occurred during document building
104 | */
105 | protected abstract void buildPdfDocument(Map model, Document document, PdfWriter writer,
106 | HttpServletRequest request, HttpServletResponse response) throws Exception;
107 | }
108 |
109 |
--------------------------------------------------------------------------------
/src/main/java/me/aboullaite/view/CsvView.java:
--------------------------------------------------------------------------------
1 | package me.aboullaite.view;
2 |
3 | import me.aboullaite.model.User;
4 | import org.supercsv.io.CsvBeanWriter;
5 | import org.supercsv.io.ICsvBeanWriter;
6 | import org.supercsv.prefs.CsvPreference;
7 |
8 | import javax.servlet.http.HttpServletRequest;
9 | import javax.servlet.http.HttpServletResponse;
10 | import java.util.List;
11 | import java.util.Map;
12 |
13 | public class CsvView extends AbstractCsvView {
14 |
15 |
16 | @Override
17 | protected void buildCsvDocument(Map model, HttpServletRequest request, HttpServletResponse
18 | response) throws Exception {
19 |
20 | response.setHeader("Content-Disposition", "attachment; filename=\"my-csv-file.csv\"");
21 |
22 | List users = (List) model.get("users");
23 | String[] header = {"FirstName", "LastName", "LastName", "JobTitle", "Company", "Address", "City", "Country",
24 | "PhoneNumber"};
25 | ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(),
26 | CsvPreference.STANDARD_PREFERENCE);
27 |
28 | csvWriter.writeHeader(header);
29 |
30 | for (User user : users) {
31 | csvWriter.write(user, header);
32 | }
33 | csvWriter.close();
34 |
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/me/aboullaite/view/ExcelView.java:
--------------------------------------------------------------------------------
1 | package me.aboullaite.view;
2 |
3 | import me.aboullaite.model.User;
4 | import org.apache.poi.hssf.util.HSSFColor;
5 | import org.apache.poi.ss.usermodel.*;
6 | import org.springframework.web.servlet.view.document.AbstractXlsView;
7 |
8 | import javax.servlet.http.HttpServletRequest;
9 | import javax.servlet.http.HttpServletResponse;
10 | import java.util.List;
11 | import java.util.Map;
12 |
13 | public class ExcelView extends AbstractXlsView{
14 |
15 | @Override
16 | protected void buildExcelDocument(Map model,
17 | Workbook workbook,
18 | HttpServletRequest request,
19 | HttpServletResponse response) throws Exception {
20 |
21 | // change the file name
22 | response.setHeader("Content-Disposition", "attachment; filename=\"my-xls-file.xls\"");
23 |
24 | @SuppressWarnings("unchecked")
25 | List users = (List) model.get("users");
26 |
27 | // create excel xls sheet
28 | Sheet sheet = workbook.createSheet("User Detail");
29 | sheet.setDefaultColumnWidth(30);
30 |
31 | // create style for header cells
32 | CellStyle style = workbook.createCellStyle();
33 | Font font = workbook.createFont();
34 | font.setFontName("Arial");
35 | style.setFillForegroundColor(HSSFColor.BLUE.index);
36 | style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
37 | font.setBold(true);
38 | font.setColor(HSSFColor.WHITE.index);
39 | style.setFont(font);
40 |
41 |
42 | // create header row
43 | Row header = sheet.createRow(0);
44 | header.createCell(0).setCellValue("FirstName");
45 | header.getCell(0).setCellStyle(style);
46 | header.createCell(1).setCellValue("LastName");
47 | header.getCell(1).setCellStyle(style);
48 | header.createCell(2).setCellValue("Age");
49 | header.getCell(2).setCellStyle(style);
50 | header.createCell(3).setCellValue("Job Title");
51 | header.getCell(3).setCellStyle(style);
52 | header.createCell(4).setCellValue("Company");
53 | header.getCell(4).setCellStyle(style);
54 | header.createCell(5).setCellValue("Address");
55 | header.getCell(5).setCellStyle(style);
56 | header.createCell(6).setCellValue("City");
57 | header.getCell(6).setCellStyle(style);
58 | header.createCell(7).setCellValue("Country");
59 | header.getCell(7).setCellStyle(style);
60 | header.createCell(8).setCellValue("Phone Number");
61 | header.getCell(8).setCellStyle(style);
62 |
63 |
64 |
65 | int rowCount = 1;
66 |
67 | for(User user : users){
68 | Row userRow = sheet.createRow(rowCount++);
69 | userRow.createCell(0).setCellValue(user.getFirstName());
70 | userRow.createCell(1).setCellValue(user.getLastName());
71 | userRow.createCell(2).setCellValue(user.getAge());
72 | userRow.createCell(3).setCellValue(user.getJobTitle());
73 | userRow.createCell(4).setCellValue(user.getCompany());
74 | userRow.createCell(5).setCellValue(user.getAddress());
75 | userRow.createCell(6).setCellValue(user.getCity());
76 | userRow.createCell(7).setCellValue(user.getCountry());
77 | userRow.createCell(8).setCellValue(user.getPhoneNumber());
78 |
79 | }
80 |
81 | }
82 |
83 | }
84 |
--------------------------------------------------------------------------------
/src/main/java/me/aboullaite/view/PdfView.java:
--------------------------------------------------------------------------------
1 | package me.aboullaite.view;
2 |
3 | import com.itextpdf.text.*;
4 | import com.itextpdf.text.pdf.PdfPCell;
5 | import com.itextpdf.text.pdf.PdfPTable;
6 | import com.itextpdf.text.pdf.PdfWriter;
7 | import me.aboullaite.model.User;
8 | import org.apache.poi.ss.usermodel.Row;
9 |
10 | import javax.servlet.http.HttpServletRequest;
11 | import javax.servlet.http.HttpServletResponse;
12 | import java.time.LocalDate;
13 | import java.util.List;
14 | import java.util.Map;
15 |
16 | public class PdfView extends AbstractPdfView {
17 | @Override
18 | protected void buildPdfDocument(Map model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception {
19 | // change the file name
20 | response.setHeader("Content-Disposition", "attachment; filename=\"my-pdf-file.pdf\"");
21 |
22 | List users = (List) model.get("users");
23 | document.add(new Paragraph("Generated Users " + LocalDate.now()));
24 |
25 | PdfPTable table = new PdfPTable(users.stream().findAny().get().getColumnCount());
26 | table.setWidthPercentage(100.0f);
27 | table.setSpacingBefore(10);
28 |
29 | // define font for table header row
30 | Font font = FontFactory.getFont(FontFactory.TIMES);
31 | font.setColor(BaseColor.WHITE);
32 |
33 | // define table header cell
34 | PdfPCell cell = new PdfPCell();
35 | cell.setBackgroundColor(BaseColor.DARK_GRAY);
36 | cell.setPadding(5);
37 |
38 | // write table header
39 | cell.setPhrase(new Phrase("First Name", font));
40 | table.addCell(cell);
41 |
42 | cell.setPhrase(new Phrase("Last Name", font));
43 | table.addCell(cell);
44 |
45 | cell.setPhrase(new Phrase("Age", font));
46 | table.addCell(cell);
47 |
48 | cell.setPhrase(new Phrase("Job Title", font));
49 | table.addCell(cell);
50 |
51 | cell.setPhrase(new Phrase("Company", font));
52 | table.addCell(cell);
53 |
54 | cell.setPhrase(new Phrase("Address", font));
55 | table.addCell(cell);
56 |
57 | cell.setPhrase(new Phrase("City", font));
58 | table.addCell(cell);
59 |
60 | cell.setPhrase(new Phrase("Country", font));
61 | table.addCell(cell);
62 |
63 | cell.setPhrase(new Phrase("Phone Number", font));
64 | table.addCell(cell);
65 |
66 | for(User user : users){
67 | table.addCell(user.getFirstName());
68 | table.addCell(user.getLastName());
69 | table.addCell(user.getAge().toString());
70 | table.addCell(user.getJobTitle());
71 | table.addCell(user.getCompany());
72 | table.addCell(user.getAddress());
73 | table.addCell(user.getCity());
74 | table.addCell(user.getCountry());
75 | table.addCell(user.getPhoneNumber());
76 |
77 | }
78 |
79 | document.add(table);
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/src/main/java/me/aboullaite/viewResolver/CsvViewResolver.java:
--------------------------------------------------------------------------------
1 | package me.aboullaite.viewResolver;
2 |
3 | import me.aboullaite.view.CsvView;
4 | import org.springframework.web.servlet.View;
5 | import org.springframework.web.servlet.ViewResolver;
6 |
7 | import java.util.Locale;
8 |
9 | public class CsvViewResolver implements ViewResolver {
10 |
11 | @Override
12 | public View resolveViewName(String s, Locale locale) throws Exception {
13 |
14 | return new CsvView();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/me/aboullaite/viewResolver/ExcelViewResolver.java:
--------------------------------------------------------------------------------
1 | package me.aboullaite.viewResolver;
2 |
3 | import me.aboullaite.view.ExcelView;
4 | import org.springframework.web.servlet.View;
5 | import org.springframework.web.servlet.ViewResolver;
6 |
7 | import java.util.Locale;
8 |
9 | public class ExcelViewResolver implements ViewResolver {
10 |
11 | @Override
12 | public View resolveViewName(String s, Locale locale) throws Exception {
13 |
14 | return new ExcelView();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/me/aboullaite/viewResolver/PdfViewResolver.java:
--------------------------------------------------------------------------------
1 | package me.aboullaite.viewResolver;
2 |
3 | import me.aboullaite.view.PdfView;
4 | import org.springframework.web.servlet.View;
5 | import org.springframework.web.servlet.ViewResolver;
6 |
7 | import java.util.Locale;
8 |
9 | public class PdfViewResolver implements ViewResolver {
10 |
11 | @Override
12 | public View resolveViewName(String s, Locale locale) throws Exception {
13 |
14 | return new PdfView();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/resources/application.yml:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aboullaite/SpringBoot-Excel-Csv/188e94efae9c57a128f5ff425e2081799d627523/src/main/resources/application.yml
--------------------------------------------------------------------------------
/src/test/java/me/aboullaite/SpringBootExcelViewApplicationTests.java:
--------------------------------------------------------------------------------
1 | package me.aboullaite;
2 |
3 | import org.junit.Test;
4 | import org.junit.runner.RunWith;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.junit4.SpringRunner;
7 |
8 | @RunWith(SpringRunner.class)
9 | @SpringBootTest
10 | public class SpringBootExcelViewApplicationTests {
11 |
12 | @Test
13 | public void contextLoads() {
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------