今天就介绍下之前在任务中遇到的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.SAVE_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里的数据对应。
以上这行就是导出的方法,望对你们有帮助。
本文出自 “迎风飘来” 博客,请务必保留此出处