在j2e中操作excel,无非2种情况,在这里我贴部分代码做个例子就OK,不管是导入和导出都是操作的都是流
1,导入,浏览器输入EXCEL到java后台解析
1,导入,浏览器输入EXCEL到java后台解析
package action;
import java.io.OutputStream;
import java.sql.ResultSet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import bean.ExcelBean;
import bean.SQLBean;
public class DownAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
{
SQLBean sq = new SQLBean();
String sql = "select * from detial";
try
{
String fname = "detial";// Excel文件名
OutputStream os = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
response.setHeader("Content-disposition", "attachment; filename=" + fname + ".xls");// 设定输出文件头,该方法有两个参数,分别表示应答头的名字和值。
response.setContentType("application/msexcel");// 定义输出类型
ResultSet res = sq.select(sql);
ExcelBean eb = new ExcelBean();
eb.createFixationSheet(res, os);// 调用生成excel文件bean
res.close();
}
catch (Exception e)
{
System.out.println(e);
}
return mapping.findForward("display");
}
}
package bean;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;
public class ExcelBean
{
private HSSFWorkbook wb = null;
public ExcelBean()
{
wb = new HSSFWorkbook();
}
public void createFixationSheet(ResultSet res, OutputStream os) throws IOException
{
HSSFSheet sheet = wb.createSheet("new sheet");
wb.setSheetName(0, "话费详单", HSSFWorkbook.ENCODING_UTF_16);
HSSFRow row = sheet.createRow((short) 0);
sheet.createFreezePane(0, 1);
cteateCell(wb, row, (short) 0, "手机号码");
cteateCell(wb, row, (short) 1, "呼叫类型");
cteateCell(wb, row, (short) 2, "对方号码");
cteateCell(wb, row, (short) 3, "起始时间");
cteateCell(wb, row, (short) 4, "通话时间");
cteateCell(wb, row, (short) 5, "通话地点");
cteateCell(wb, row, (short) 6, "长途类型");
cteateCell(wb, row, (short) 7, "基本话费");
cteateCell(wb, row, (short) 8, "长话费");
cteateCell(wb, row, (short) 9, "总话费");
int ii = 0;
try
{
int i = 0;
ii = res.getMetaData().getColumnCount();
while (res.next())
{
i++;
HSSFRow row2 = sheet.createRow((short) i);
for (int j = 0; j < ii; j++)
{
String ss = "";
if (res.getString(j + 1) == null)
ss = "空 null";
else
ss = res.getString(j + 1);
cteateCell(wb, row2, (short) j, ss);
}
}
}
catch (SQLException e)
{
e.printStackTrace();
}
wb.write(os);
os.flush();
os.close();
}
private void cteateCell(HSSFWorkbook wb, HSSFRow row, short col, String val)
{
HSSFCell cell = row.createCell(col);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(val);
HSSFCellStyle cellstyle = wb.createCellStyle();
cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
cell.setCellStyle(cellstyle);
}
}
2,导出,java后台生成excel输入到浏览器
public class UserAction extends ActionSupport
{
//导出excel,这里就是说下载模板,里面的东西是空的
public String export() throws Exception
{
Connection con = null;
try
{
con = dbUtil.getCon();
Workbook wb = new HSSFWorkbook();
String headers[] = { "编号", "姓名", "电话", "Email", "QQ" };
ResultSet rs = userDao.userList(con, null);
ExcelUtil.fillExcelData(rs, wb, headers);
ResponseUtil.export(ServletActionContext.getResponse(), wb, "导出excel.xls");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
dbUtil.closeCon(con);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
//模板不是说生成的,是放在服务器上的一个模板,直接读下就OK
public String export2() throws Exception
{
Connection con = null;
try
{
con = dbUtil.getCon();
ResultSet rs = userDao.userList(con, null);
Workbook wb = ExcelUtil.fillExcelDataWithTemplate(userDao.userList(con, null), "userExporTemplate.xls");
ResponseUtil.export(ServletActionContext.getResponse(), wb, "利用模版导出excel.xls");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
dbUtil.closeCon(con);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
//上传excel模板,后台解析excel
public String upload() throws Exception
{
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("上传的file"));
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet hssfSheet = wb.getSheetAt(0); // 获取第一个Sheet页
if (hssfSheet != null)
{
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++)
{
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null)
{
continue;
}
User user = new User();
user.setName(ExcelUtil.formatCell(hssfRow.getCell(0)));
user.setPhone(ExcelUtil.formatCell(hssfRow.getCell(1)));
user.setEmail(ExcelUtil.formatCell(hssfRow.getCell(2)));
user.setQq(ExcelUtil.formatCell(hssfRow.getCell(3)));
Connection con = null;
try
{
con = dbUtil.getCon();
userDao.userAdd(con, user);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
dbUtil.closeCon(con);
}
}
}
JSONObject result = new JSONObject();
result.put("success", "true");
ResponseUtil.write(ServletActionContext.getResponse(), result);
return null;
}
}
public class ExcelUtil {
public static void fillExcelData(ResultSet rs,Workbook wb,String[] headers)throws Exception{
int rowIndex=0;
Sheet sheet=wb.createSheet();
Row row=sheet.createRow(rowIndex++);
for(int i=0;i<headers.length;i++){
row.createCell(i).setCellValue(headers[i]);
}
while(rs.next()){
row=sheet.createRow(rowIndex++);
for(int i=0;i<headers.length;i++){
row.createCell(i).setCellValue(rs.getObject(i+1).toString());
}
}
}
public static Workbook fillExcelDataWithTemplate(ResultSet rs,String templateFileName)throws Exception{
InputStream inp=ExcelUtil.class.getResourceAsStream("/com/java1234/template/"+templateFileName);
POIFSFileSystem fs=new POIFSFileSystem(inp);
Workbook wb=new HSSFWorkbook(fs);
Sheet sheet=wb.getSheetAt(0);
// 获取列数
int cellNums=sheet.getRow(0).getLastCellNum();
int rowIndex=1;
while(rs.next()){
Row row=sheet.createRow(rowIndex++);
for(int i=0;i<cellNums;i++){
row.createCell(i).setCellValue(rs.getObject(i+1).toString());
}
}
return wb;
}
public static String formatCell(HSSFCell hssfCell){
if(hssfCell==null){
return "";
}else{
if(hssfCell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
return String.valueOf(hssfCell.getBooleanCellValue());
}else if(hssfCell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
return String.valueOf(hssfCell.getNumericCellValue());
}else{
return String.valueOf(hssfCell.getStringCellValue());
}
}
}
}
public class ResponseUtil {
public static void write(HttpServletResponse response,Object o)throws Exception{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.print(o.toString());
out.flush();
out.close();
}
public static void export(HttpServletResponse response,Workbook wb,String fileName)throws Exception{
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"iso8859-1"));
response.setContentType("application/ynd.ms-excel;charset=UTF-8");
OutputStream out=response.getOutputStream();
wb.write(out);
out.flush();
out.close();
}
}
3,利用springMVC中自带的AbstractExcelView或者AbstractJExcelView视图,这2个视图就是专门操作Excel的,区别就是前面一个用的jxl的包,后面一个用的poi的包。
这里贴出我以前用jxl写的一段代码(其实POI一个意思,只不过继承的包不同而已),首先打开AbstractJExcelView源码看一下:
public class ExcelView extends AbstractJExcelView {
private String[] columnsNames = { "工单号","县市", "申请人", "申请人手机号码"};
private int[] columnWidths = { 10,30,20,20};
@Override
protected void buildExcelDocument(Map<String, Object> model,WritableWorkbook workbook, HttpServletRequest request,HttpServletResponse response) throws Exception {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode("号码明细.xls", "UTF-8"));
OutputStream os = null;
try {
os = response.getOutputStream();
workbook = Workbook.createWorkbook(os);
WritableSheet ws = workbook.createSheet("号码明细", 1);
addColumnNamesToSheet(ws);
List<TerminalSendOtherBean> terminalSendOtherBeans = (List<TerminalSendOtherBean>) model.get("beans");
addData(ws, terminalSendOtherBeans);
workbook.write();
} catch (Exception e) {
}finally{
workbook.close();
os.flush();
os.close();
}
}
/**
* 将数据写入工作表中
*
* @param ws
* @param customers
*/
private void addData(WritableSheet ws, List<TerminalSendOtherBean> terminalSendOtherBeans) {
Label label = null;
for (int i = 0; i < terminalSendOtherBeans.size(); i++) {
TerminalSendOtherBean bean = terminalSendOtherBeans.get(i);
try {
label = new Label(0, (i + 1), bean.getId()+"");
ws.addCell(label);
label = new Label(1, (i + 1), bean.getDeptName());
ws.addCell(label);
label = new Label(2, (i + 1), bean.getPersonName());
ws.addCell(label);
label = new Label(3, (i + 1), bean.getTelephone1());
ws.addCell(label);
} catch (WriteException e) {
e.printStackTrace();
}
}
}
/**
* 增加表头
*
* @param ws
*/
private void addColumnNamesToSheet(WritableSheet ws) {
Label label = null;
for (int i = 0; i < columnsNames.length; i++) {
label = new Label(i, 0, columnsNames[i],getFormat());
try {
ws.addCell(label);
ws.setColumnView(i, columnWidths[i]);
} catch (WriteException e) {
e.printStackTrace();
}
}
}
private WritableCellFormat getFormat() {
WritableFont font = new WritableFont(WritableFont.ARIAL,WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD);
WritableCellFormat format=new WritableCellFormat(font);
try {
format.setWrap(true);
format.setAlignment(Alignment.CENTRE);
format.setVerticalAlignment(VerticalAlignment.CENTRE);
} catch (WriteException e) {
e.printStackTrace();
}
return format;
}
}
public ModelAndView doQuery(HttpServletRequest request, HttpServletResponse response) throws Exception {
FirstInvestmentForm firstInvestmentForm = (FirstInvestmentForm) this.bindForm(request);
FirstInvestmentBean firstInvestmentBean = firstInvestmentForm.getFirstInvestmentBean();
List<FirstInvestmentOtherBean1> list = firstInvestmentService.getBeans1(firstInvestmentBean);
Map<String, List<FirstInvestmentOtherBean1>> model = new HashMap();
model.put("beans", list);
return new ModelAndView(new ExcelView(), model);
}