您的位置:首页 > 编程语言 > Java开发

java导出Excel之前台后台

2014-07-04 09:54 309 查看
今天就介绍下之前在任务中遇到的Excel导出的问题,刚做的时候查了很多资料,发现都不太全,今天就介绍下前台和后台。

1.前台

优点:在windows和linux环境下都可执行,但是需要拼接。

table2Excel.js

var tableId;
var excelTitle;
function exportExcel(tableId,excelTitle,datesource){
this.tableId=tableId;
this.excelTitle=excelTitle;
try 
{
var xls = new ActiveXObject ( "Excel.Application" );
}
  catch(e) {
        alert( "要打印该表,您必须安装Excel电子表格软件,同时浏览器须使用“ActiveX 控件”,您的浏览器须允许执行控件。 ");
             return "";
    }
   xls.visible =true; // 设置excel为可见
   var xlBook = xls.Workbooks.Add;
   var xlsheet = xlBook.Worksheets(1);
   //--合并--
       var oTable=document.all[this.tableId];
   xlsheet.Rows(1).Font.Name="黑体";
   //--设置显示字符而不是数字--
   xlsheet.Columns(2).NumberFormatLocal="@";
   xlsheet.Columns(3).NumberFormatLocal="@";
   xlsheet.Columns(4).NumberFormatLocal="@";
   xlsheet.Columns(5).NumberFormatLocal="@";
   xlsheet.Columns(6).NumberFormatLocal="@";
   xlsheet.Columns(7).NumberFormatLocal="@";
   xlsheet.Columns(8).NumberFormatLocal="@";
   xlsheet.Columns(9).NumberFormatLocal="@";
   xlsheet.Columns(10).NumberFormatLocal="@";
    // 设置单元格内容自动换行 range.WrapText = true ;
    // 设置单元格内容水平对齐方式 
//        range.HorizontalAlignment =Excel.XlHAlign.xlHAlignCenter;//设置单元格内容竖直堆砌方式
//        range.VerticalAlignment=Excel.XlVAlign.xlVAlignCenter;
//        range.WrapText = true; xlsheet.Rows(3).WrapText=true;  //自动换行
  
    // 设置标题栏
     xlsheet.Cells(1,1).Value="";
     xlsheet.Cells(1,2).Value="xx";//标题栏题目
     xlsheet.Cells(1,3).Value="xx";
     xlsheet.Cells(1,4).Value="xx";
     xlsheet.Cells(1,5).Value="xx";
     xlsheet.Cells(1,6).Value="xx";
     xlsheet.Cells(1,7).Value="xx";
     xlsheet.Cells(1,8).Value="xx";
     xlsheet.Cells(1,9).Value="xx";
     xlsheet.Cells(1,10).Value="xx";
     xlsheet.Cells(1,11).Value="xx";
     xlsheet.Cells(1,12).Value="xx";
     xlsheet.Cells(1,13).Value="xx";
    
 date = eval(datesource);  
 for(var da=0; da<date.length; da++)  {   
xlsheet.Cells(da+2,1).Value=date[da].ID;
xlsheet.Cells(da+2,2).Value=date[da].COLLA_CODE;
xlsheet.Cells(da+2,3).Value=date[da].OCOLLA_ID;
xlsheet.Cells(da+2,4).Value=date[da].WARRANT_ID;
xlsheet.Cells(da+2,5).Value=date[da].IOU_ID;
xlsheet.Cells(da+2,6).Value=date[da].LOAN_PER;
xlsheet.Cells(da+2,7).Value=date[da].COL_TYPE;
xlsheet.Cells(da+2,8).Value=date[da].EST_TIME;
xlsheet.Cells(da+2,9).Value=date[da].ACCORG_ID;
xlsheet.Cells(da+2,10).Value=date[da].STOORG_ID;
xlsheet.Cells(da+2,11).Value=date[da].CURRENCY;
xlsheet.Cells(da+2,12).Value=date[da].LOAN_AMT;
xlsheet.Cells(da+2,13).Value=date[da].STATUS;
}  
    
     xlsheet.Columns.AutoFit;
//      xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(rowNum+1,cellNum)).HorizontalAlignment =-4108;// 居中
//      xlsheet.Range( xlsheet.Cells(1,1),xlsheet.Cells(1,7)).VerticalAlignment =-4108;
//      xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Font.Size=10;
//      xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(3).Weight = 2; // 设置左边距
//      xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(4).Weight = 2;// 设置右边距
//      xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(1).Weight = 2;// 设置顶边距
//      xlsheet.Range( xlsheet.Cells(2,1),xlsheet.Cells(rowNum+1,cellNum)).Borders(2).Weight = 2;// 设置底边距
  xls.UserControl = true; // 很重要,不能省略,不然会出问题 意思是excel交由用户控制
     xls=null;
     xlBook=null;
     xlsheet=null;
}


其中要导出数据的话,直接调用exportExcel(tableId,excelTitle,msg);方法。tableId指的是table的代号(可有可无),excelTitle指的的表格的标题,msg指的是数据,可以用ajax后台传输,另外要注意的是运行成功后,要安装Excel ,不要用wps,之前试过,wps不支持。

2.后台

优点:可以弹出框体,让你自己选择路径和格式

缺点:部分弹出框体的方法在linux中不支持,所以只能在window的环境下运行。

PrintService.java

package com.rfid.service.print;
/**
 * 导出excel类
 *  
 */
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.filechooser.FileFilter;

import org.apache.poi2.hssf.usermodel.HSSFCell;
import org.apache.poi2.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi2.hssf.usermodel.HSSFFont;
import org.apache.poi2.hssf.usermodel.HSSFRichTextString;
import org.apache.poi2.hssf.usermodel.HSSFRow;
import org.apache.poi2.hssf.usermodel.HSSFSheet;
import org.apache.poi2.hssf.usermodel.HSSFWorkbook;
import org.apache.poi2.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.rfid.entity.print.P_05010110;

@Component
public class PrintService {
Logger log = LoggerFactory.getLogger(PrintService.class);
public void resultSetToExcel(String[] headers, List list,
String sheetName) throws Exception {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(0, sheetName, HSSFWorkbook.ENCODING_UTF_16);
HSSFRow row = sheet.createRow((short) 0);
HSSFCell cell;

String adr = selectSavePath();
// 产生表格标题行
row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 遍历集合数据,产生数据行
Iterator<P_05010110> it = list.iterator();
int index = 0;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
P_05010110 t = (P_05010110) it.next();
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();
for (short i = 0; i < headers.length; i++) {
cell = row.createCell(i);

Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
// 判断值的类型后进行强制类型转换
String textValue = null;

// 其它数据类型都当作字符串简单处理
textValue = value.toString();

// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null) {
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
HSSFRichTextString richString = new HSSFRichTextString(
textValue);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
} catch (SecurityException e) {
log.info("excel export error:"+e.getMessage());
} catch (NoSuchMethodException e) {
log.info("excel export error:"+e.getMessage());
} catch (IllegalArgumentException e) {
log.info("excel export error:"+e.getMessage());
} catch (IllegalAccessException e) {
log.info("excel export error:"+e.getMessage());
} catch (InvocationTargetException e) {
log.info("excel export error:"+e.getMessage());
} finally {
// 清理资源
}
}
}

//String adr = "d:\\"+xlsName+".xls";
FileOutputStream fOut = new FileOutputStream(adr);
workbook.write(fOut);
fOut.flush();
fOut.close();

         //path = D:\\Backup\\我的文档\\2013-6-26_110848.xls  
        String fileName = adr.replace('\\', '/');  
        StringTokenizer st = new StringTokenizer(fileName, "/");  
        while (st.hasMoreTokens())  
          {  
            String sub = st.nextToken();  
            if ((sub.indexOf(' ') != -1) || (sub.indexOf('&') != -1) || (sub.indexOf('(') != -1) || (sub.indexOf(')') != -1) || (sub.indexOf('[') != -1) || (sub.indexOf(']') != -1) || (sub.indexOf('{') != -1) || (sub.indexOf('}') != -1) || (sub.indexOf('^') != -1) || (sub.indexOf('=') != -1) || (sub.indexOf(';') != -1) || (sub.indexOf('!') != -1) || (sub.indexOf('\'') != -1) || (sub.indexOf('+') != -1) || (sub.indexOf(',') != -1) || (sub.indexOf('`') != -1) || (sub.indexOf('~') != -1))   //过滤掉特殊字符  
            {  
                fileName = fileName.replaceFirst(sub, "\"" + sub + "\"");  
             }  
           }       // fileName = D:/Backup/我的文档/2013-6s-09_110848.xls  
           Runtime.getRuntime().exec("cmd /E:ON /c start " + fileName);
           JOptionPane.showMessageDialog(null, "导出数据成功!"); 
           
        } 

//获得框图
public String selectSavePath(){  
         
         SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd_HHmmss");  
         String name = dateformat.format(new Date());  
         name = name + ".xls";  
       //构造文件保存对话框  
         JFileChooser chooser = new JFileChooser();  
         chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
         chooser.setDialogType(JFileChooser.S***E_DIALOG);  
         chooser.setMultiSelectionEnabled(false);  
         chooser.setAcceptAllFileFilterUsed(false);  
         chooser.setDialogTitle("保存单位数据文件");  
           
//        //取得文件名输入框设置指定格式  
//         JTextField fileNameField = getTextField(chooser); 
//         fileNameField.setText(name);  
           //替代方法
         chooser.setSelectedFile(new File(name)); // 生成默认

           
         //添加文件过滤器  
         chooser.addChoosableFileFilter(new FileFilter(){  

             public boolean accept(File f) {  
                      return true;   
             }  

             public String getDescription() {  
                 return "所有文件(*.*)";  
             }  
               
         });  
         chooser.addChoosableFileFilter(new FileFilter(){  

             public boolean accept(File f) {  
                 if (f.getName().endsWith("xls") || f.isDirectory()) {  
                      return true;   
                 }else{  
                     return false;   
                 }  
             }  

             public String getDescription() {  
                 return "Excel文件(*.xls)";  
             }  
               
         });  
           
         //打开对话框  
         int result = chooser.showSaveDialog(null);//null  
           
         //文件确定  
         if(result==JFileChooser.APPROVE_OPTION) {  
        File file = chooser.getSelectedFile();
         if (!file.getName().toLowerCase().endsWith(".xls")) {
           file = new File(file.getParent(), file.getName() + ".xls");
         }
             String outPath = file.getAbsolutePath();
            if(new File(outPath).exists()){   
            JOptionPane.showMessageDialog(null, "文件已经存在,请重命名?");
            return null;
             }  
             return outPath;  
         }
       return null;  
     }  
 
}


后台的导出其实是最直接的,但是有一定的局限性,这里同样是调用方法resultSetToExcel(String[] headers, List list,

String sheetName) head是头部的集合,list自然是对应的数据,这里的heads应该与list里的数据对应。

以上这行就是导出的方法,望对你们有帮助。

本文出自 “迎风飘来” 博客,请务必保留此出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: