Gemmet stor mængde data i xls/ Excel format,org.apache.poi.
Hej jeg har nedenstående kode:import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
// SERVLET !!!
public class ExcelServlet extends HttpServlet {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Users");
sheet.setDefaultColumnWidth((short)25);
Integer[] userids = usf.getUserids(); // cirka 7000 users eller mere
UserModel[] rows = userejb.getUsers(userids); // UserModel = hibernate, cirka 7000 rows eller mere
// generer nu mine rækker med tilhørende kolonner
for (int i = 0; i < cols.length; i++) {
for (int j = 0; j < rows.length; j++) {
HSSFRow row = sheet.createRow((short)j+1);
HSSFCell usercell1 = row.createCell((short)(0));
usercell1.setEncoding(HSSFCell.ENCODING_UTF_16);
usercell1.setCellValue(rows[j].getFirstname());
HSSFCell usercell2 = row.createCell((short)1);
usercell2.setEncoding(HSSFCell.ENCODING_UTF_16);
usercell2.setCellValue(rows[j].getLastname());
HSSFCell usercell3 = row.createCell((short)2);
usercell3.setEncoding(HSSFCell.ENCODING_UTF_16);
usercell3.setCellValue(rows[j].getUsername());
HSSFCell usercell4 = row.createCell((short)3);
usercell4.setEncoding(HSSFCell.ENCODING_UTF_16);
usercell4.setCellValue(rows[j].getEmail());
PropertyModel[] userproperty= (PropertyModel[])rows[j].getProperties().toArray(new PropertyModel[0]);
for (int k = 0; k < property.length; k++) {
for (int index = 0; index < userproperty.length; index++) {
if (property[k].getId() == userproperty[index].getKey().getId() && userproperty[index].getUserid() == rows[j].getId()){
HSSFCell usercell = row.createCell((short)((cols.length)+k));
usercell.setEncoding(HSSFCell.ENCODING_UTF_16);
usercell.setCellValue(userproperty[index].getValue());
}
}
}
}
}
ByteArrayOutputStream bus = new ByteArrayOutputStream(); wb.write(bus);
ClassLoader loader = Thread.currentThread().getContextClassLoader();
MimetypesFileTypeMap mftm = new MimetypesFileTypeMap(loader.getResourceAsStream("mimetypes.properties"));
String filename = "users.xls";
resp.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
if (req.getScheme().equals("https")) {
resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
resp.setHeader("Cache-Control", "post-check=0, pre-check=0");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Pragma", "public");
resp.setHeader("Expires", "Mon, 1 Jan 1995 05:00:00 GMT");
} else {
resp.setHeader("Cache-Control", "max-age=10");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Expires", "-1");
}
resp.setContentType(mftm.getContentType(filename));
resp.setContentLength(bus.size());
bus.writeTo(resp.getOutputStream());
resp.flushBuffer();
}
Koden virker fint når jeg ikke har mange rækker, men når jeg har mange rækker virker det ikke. Er det ikke muligt at interer over f.eks 100 rækker af gangen og så skrive disse til en TMP fil ( buffer) eller ligende. Ville sådan set gerne tilføje til min eksisternede ByteArrayOutputStream bus, men aner ikke hvordan jeg gør. Jeg har ledt nettet tyndt men har desværre ikke fundet noget. Så er der nogen der kan hjælpe vil jeg være taknemmelig
