Note that this example uses Spring and a ControllerContext class that I use to pass information about different layers (Context-Object pattern). You can of course get the fundamental idea in case you do not use a ControllerContext in your design.
The unique dependency:
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>2.0</version>
</dependency>
The Controller is very similar to the one I presented for the ExcelView post. Just a little modification so actually we can render either Excel or CSV:
package com.nestorurquiza.spring.web;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.nestorurquiza.spring.web.ExcelView;
import com.nestorurquiza.spring.web.CsvView;
@Controller
public class TabularController extends RootController {
@RequestMapping("/board")
public ModelAndView welcomeHandler(HttpServletRequest request,
HttpServletResponse response) {
//Initialize the context (mandatory)
ControllerContext ctx = new ControllerContext(request, response);
init(ctx);
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Map<String, List<Map<String, Object>>> excelWorkbookViewMap = new HashMap<String, List<Map<String, Object>>>();
List<Map<String, Object>> excelRows = new ArrayList<Map<String, Object>>();
try {
Map<String, Object> excelRow = new HashMap<String, Object>();
excelRow.put("Name", "Gregory");
excelRow.put("Age", 33);
excelRow.put("Salary", 33000.55);
excelRow.put("DOB", df.parse("2/1/1980"));
excelRow.put("Graduated", false);
excelRow.put("Comments", "He is our \"report designer\"");
excelRows.add(excelRow);
excelRow = new HashMap<String, Object>();
excelRow.put("Name", "Mark");
excelRow.put("Age", 41);
excelRow.put("Salary", 33000.55);
excelRow.put("DOB", df.parse("20/12/1975"));
excelRow.put("Graduated", true);
excelRow.put("Comments", "He is our \"web designer\"");
excelRows.add(excelRow);
excelWorkbookViewMap.put("First Sheet", excelRows);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String ert = ctx.getParameter("ert");
String baseFilename = "board";
if("csv".equals(ert)) {
Map<String, List<Map<String, Object>>> csvViewMap = new HashMap<String, List<Map<String, Object>>>();
String fileName = baseFilename + ".csv";
csvViewMap.put(fileName, excelRows);
return new ModelAndView(new CsvView(ctx, fileName, ','), csvViewMap);
} else {
String fileName = baseFilename + ".xls";
return new ModelAndView(new ExcelView(ctx, fileName), excelWorkbookViewMap);
}
}
}
The CsvView:package com.nestorurquiza.spring.web;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.AbstractView;
import au.com.bytecode.opencsv.CSVWriter;
import com.nestorurquiza.utils.Utils;
import com.nestorurquiza.web.ControllerContext;
public class CsvView extends AbstractView {
private static final String CONTENT_TYPE = "text/csv";
public CsvView(ControllerContext ctx, String fileName, char fieldSeparator) {
super();
if(Utils.isEmpty(fileName)) {
fileName = "fileName";
}
this.fileName = fileName;
this.fieldSeparator = fieldSeparator;
this.ctx = ctx;
setContentType(CONTENT_TYPE);
}
private String fileName;
private char fieldSeparator;
private ControllerContext ctx;
/**
*
* model: Map<String, List<Map, Object>>
* This view returns back a CSV stream
* The model must come with an entry for fileName key
* Each list entry (the list map) corresponds to a row
* The headers for each row are the list map keys
* The comma separated values are the list map values
*
* @author nestor
*
*/
protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
CSVWriter writer = new CSVWriter(response.getWriter(), fieldSeparator);
if (Utils.isEmpty(model)) {
writer.writeNext("error.empty.model".split(""));
} else {
Set<Map.Entry<String, List<Map<String, Object>>>> set = model.entrySet();
for (Map.Entry<String, List<Map<String, Object>>> entry : set) {
String key = entry.getKey();
if (fileName.equals(key)) {
List<Map<String, Object>> content = entry.getValue();
int rowCount = 0;
for (Map<String, Object> row : content) {
if (rowCount == 0) {
String[] tokens = new String[row.size()];
int i = 0;
for( String cellName : row.keySet() ) {
tokens[i] = cellName;
i++;
}
writer.writeNext(tokens);
}
String[] tokens = new String[row.size()];
int i = 0;
for( String cellName : row.keySet() ) {
Object cellValue = row.get(cellName);
tokens[i] = cellValue.toString();
i++;
}
writer.writeNext(tokens);
rowCount++;
}
}
}
}
writer.flush();
}
}
No comments:
Post a Comment