需求:
在客户端可以连接默认打印机打印服务端文件
原始模板

开发思路:
1、根据模板生成新的文件,并保存至服务器
2、将生成的文件转化成html
3、客户端打印html文件
本来想用freemarker进行套打,但是不知道什么原因,生成的文件在转化过程中一直报类型转换异常,找了好多解决办法,但是都没办法解决,忘后来人解决!!!!!!!!!!!
最后没办法,只能有原始办法,对模板中的标签进行替换
第一步:根据模板生成新的文件
import org.apache.poi.hssf.usermodel.HSSFCell;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class ExcelUtil {
/**
* 替换Excel2003模板文件内容
* @param map
* 需要替换的标签建筑队形式
* @param intPath
* Excel模板文件路径
* @param outPath
* Excel生成文件路径
*/
public static boolean replaceExcel2003Value(Map map, String intPath, String outPath) {
boolean flag = true;
try {
FileInputStream fs = new FileInputStream(intPath);
//EXCEL xlsx格式与xls格式用的类是不同的,xlsx用的是XSSFWorkbook
HSSFWorkbook workbook = new HSSFWorkbook(fs);
HSSFWorkbook wb = (HSSFWorkbook) workbook;
HSSFSheet sheet;
//由于个人使用是多sheet故获取excel对象后进行sheet遍历,分别对每个sheet里面的标签进行替换
for (int j = 0; j < wb.getNumberOfSheets(); j++) {
sheet = workbook.getSheetAt(j);
Iterator rows = sheet.rowIterator();
while (rows.hasNext()) {
HSSFRow row = (HSSFRow) rows.next();
if (row != null) {
int num = row.getLastCellNum();
for (int i = 0; i < num; i++) {
HSSFCell cell = row.getCell(i);
if (cell != null) {
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
}
if (cell == null || cell.getStringCellValue() == null) {
continue;
}
String value = cell.getStringCellValue();
if (!"".equals(value)) {
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String text = it.next();
if (value.indexOf(text) > -1) {
value = value.replace(text,"");
cell.setCellValue(value+map.get(text).toString());
break;
}
}
} else {
cell.setCellValue("");
}
}
}
}
}
// 输出文件
FileOutputStream fileOut = new FileOutputStream(outPath);
wb.write(fileOut);
fileOut.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
/**
* 替换Excel2007模板文件内容
* @param map
* 需要替换的标签建筑队形式
* @param intPath
* Excel模板文件路径
* @param outPath
* Excel生成文件路径
*/
public static boolean replaceExcel2007Value(Map map, String intPath, String outPath) {
boolean flag = true;
try {
FileInputStream fs = new FileInputStream(intPath);
//EXCEL xlsx格式与xls格式用的类是不同的,xlsx用的是XSSFWorkbook
XSSFWorkbook workbook = new XSSFWorkbook(fs);
XSSFWorkbook wb = (XSSFWorkbook) workbook;
XSSFSheet sheet;
//由于个人使用是多sheet故获取excel对象后进行sheet遍历,分别对每个sheet里面的标签进行替换
for (int j = 0; j < wb.getNumberOfSheets(); j++) {
sheet = workbook.getSheetAt(j);
Iterator rows = sheet.rowIterator();
while (rows.hasNext()) {
XSSFRow row = (XSSFRow) rows.next();
if (row != null) {
int num = row.getLastCellNum();
for (int i = 0; i < num; i++) {
XSSFCell cell = row.getCell(i);
if (cell != null) {
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
}
if (cell == null || cell.getStringCellValue() == null) {
continue;
}
String value = cell.getStringCellValue();
if (!"".equals(value)) {
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String text = it.next();
if (value.indexOf(text) > -1) {
value = value.replace(text,"");
cell.setCellValue(value+map.get(text).toString());
break;
}
}
} else {
cell.setCellValue("");
}
}
}
}
}
// 输出文件
FileOutputStream fileOut = new FileOutputStream(outPath);
wb.write(fileOut);
fileOut.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
}
第二步:将文件转换正html页面
import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
public class excelToHtml {
/**
* 将excel2003转换为html文件
*
* @param filePath word文件路径
* @param outFileName html文件名称
* @throws IOException
* @throws TransformerException
* @throws ParserConfigurationException
*/
public static String excelToHtml(String filePath,String outFileName){
File excelFile = new File(filePath);
InputStream is = null;
StringWriter writer = null;
String content = null;
try {
if (excelFile.exists()) {
String htmlPath = excelToHtml.class.getResource("/").getPath()+"/templates/manage/print/";
// 判断html文件是否存在
File htmlFile = new File(htmlPath + outFileName);
if (htmlFile.exists()) {
return outFileName;
}
is = new FileInputStream(excelFile);
// Workbook workBook = WorkbookFactory.create(is);
HSSFWorkbook workBook = new HSSFWorkbook(is);
ExcelToHtmlConverter converter = new ExcelToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
//设置不输出行号(1 2 3...)及列标(A B C...)等
converter.setOutputColumnHeaders(false);
converter.setOutputHiddenColumns(false);
converter.setOutputLeadingSpacesAsNonBreaking(false);
converter.setOutputRowNumbers(false); //不输出行号
converter.processWorkbook(workBook);
writer = new StringWriter();
Transformer serializer = TransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
serializer.setOutputProperty(OutputKeys.INDENT, "YES");
serializer.setOutputProperty(OutputKeys.METHOD, "HTML");
serializer.transform(
new DOMSource(converter.getDocument()),
new StreamResult(writer));
content = writer.toString();
//替换掉Sheet1 Sheet2 Sheet3...
content = content.replaceAll("<h2>Sheet[\\d]</h2>", "")
.replaceAll("<h2>第[一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾]页</h2>", "");
FileOutputStream fos = new FileOutputStream(htmlPath+outFileName);
Writer os = new OutputStreamWriter(fos, "UTF-8");
os.write(content);
os.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return outFileName;
}
public static void main(String[] args) {
String htmlPath = excelToHtml.class.getResource("/").getPath().replace("/target/classes","")+"src/main/resources/templates/manage/print/";
//excelToHtml("F:\\template\\333.xls");
System.out.println(htmlPath);
}
}
注意:如果实在本地打印的话,需要将转化成的html页面进行设置
content = content.replaceAll("<body class=\"b1\">","<body class=\"b1\" οnlοad=\"javascript:doPrint()\" >");
content = content.replaceAll("</body>","</body>\n<script type=\"text/javascript\">\nfunction doPrint(){\n" +
" window.focus(); //这个一定要有,否则打印的是A页面+B页面\n" +
" window.print();\n" +
" }\n</script>");
第三步:在项目中的功能页面将生成的html引入,不然直接打印该页面就会出现先加载该页面,为了不加载该页面可以直接打印,可以使用iframe将该页面引入到某些功能页面中,在功能页面中点击打印就可以直接不显示该页面打印,但是会弹出打印预览界面
<iframe id="printHtml" width = "0" height = "0" style = "display:none"></iframe>
在点击打印按钮时,将该页面直接加载到iframe 中,然后就直接弹出打印预览界面进行打印
document.getElementById('printHtml').src = "页面地址";
最后生成的效果:

点击excel打印,弹出打印预览界面

OK,excel通过浏览器在本地打印就完成了!!!!!!!!!!!!!!!!!!
4667





