jsp中导出word的一种实现
方式:
1.将原来的word另存为网页形式,把扩展名改成jsp,利用DreamWeaver的拆分模式在对应的位置填充jsp标签。
2.jsp的第一行:<%@ page contentType="application/msword; charset=gb2312" %>
保存成的word名字:<%response.setHeader(“Content-Disposition”, “attachment;filename=test.doc”);%>
3.剩下的完全把这个word当一个jsp页面对待就可以了。
以后访问这张页面的时候就提示打开还是保存word了
补充:
后来发现其实直接设计好html,导出的word也是很不错的,这样代码更好维护。
相关:
struts2导出excel笔记
–EOF–
window.location or window.location.href?
参考:
1.http://www.javascriptkit.com/jsref/location.shtml
2.http://www.highdots.com/forums/javascript-discussion-multi-lingual/window-location-window-location-href-276539.html
Location contains information about the current URL of the browser. The most common usage of Location is simply to use it to automatically navigate the user to another page:
<script type="text/javascript"> window.location="http://www.google.com" </script>
所以推荐使用window.location,包含更多信息
理由(参考文章的第二篇)
Although "window.location.href" also seems to work. The "entire URL" href property (of window.location) appears to be a bit redundant. Other properties of "windows.location" could be useful for reading or changing portions of the URL like domain/host names and port numbers (which are sometimes not stated - permitted to remain the default).
–EOF–
struts2导出excel笔记
例子很简单,就一个Action类和一个Service类
1.所需jar包
struts2需要jar包:commons-logging.jar、freemarker-2.3.8.jar、ognl-2.6.11.jar、struts2-core-2.0.11.1.jar、xwork-2.0.4.jar
excel导出:jxl.jar
2.配置(web.xml)
.....
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
......
Struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > <struts> <package name="platform-default" extends="struts-default"> <action name="excel" class="action.ExcelAction"> <result name="excel" type="stream"> <param name="contentType"> application/vnd.ms-excel </param> <param name="inputName">excelStream</param> <param name="contentDisposition"> filename="export.xls" </param> <param name="bufferSize">1024</param> </result> </action> </package> </struts>
3.Action实现(ExcelAction.java)
package action;
import java.io.InputStream;
import service.IExcelService;
import service.impl.ExcelServiceImpl;
public class ExcelAction {
InputStream excelStream;
public String execute(){
IExcelService es = new ExcelServiceImpl();
excelStream = es.getExcelInputStream();
return "excel";
}
//get set...
}
4.Service实现
a.接口(IExcelService.java)
package service;
import java.io.InputStream;
public interface IExcelService {
InputStream getExcelInputStream();
}
b.实现类(ExcelServiceImpl.java)
package service.impl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import jxl.Workbook;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import service.IExcelService;
public class ExcelServiceImpl implements IExcelService {
@Override
public InputStream getExcelInputStream() {
//将OutputStream转化为InputStream
ByteArrayOutputStream out = new ByteArrayOutputStream();
putDataOnOutputStream(out);
return new ByteArrayInputStream(out.toByteArray());
}
private void putDataOnOutputStream(OutputStream os) {
jxl.write.Label label;
WritableWorkbook workbook;
try {
workbook = Workbook.createWorkbook(os);
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
label = new jxl.write.Label(0, 0, "struts2导出excel");
sheet.addCell(label);
workbook.write();
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样例子就完成了:
直接访问:http://127.0.0.1:8080/excel/excel.action 就可以导出excel
说明:
1、例子中OutputStream转InputStream是一种简单的实现,但是需要内存比较多,可以参考:
http://ostermiller.org/convert_java_outputstream_inputstream.html
2、参考实现:http://merrygrass.javaeye.com/blog/558274
代码在附件中,jar包自己下载后导入即可
问题:
//横向打印 sheet.getSettings().setOrientation(PageOrientation.LANDSCAPE); //默认行高(似乎不起作用) sheet.getSettings().setDefaultRowHeight(510); //设置行宽 sheet.getSettings().setDefaultColumnWidth(10);
横向设置和行宽起作用,但行高不起作用,望高手回答
———————————————————————————
默认行高问题解决:
此方法针对excel2003,在创建sheet后,添加如下代码
for(int i=0;i<65536;i++){
sheet.setRowView(i, 360);
}
补充:jxl中20个高度对应excel的1个高度,jxl的1个宽度对应excel的7个宽度
–EOF–
网页打印格式设置总结
1.分页符的添加
.page_break{
page-break-after:always;
}
分页的时候加上:<div class=”page_break”></div>
2.为使各个浏览器显示效果尽量一致,加上
*{
margin:0;
padding:0;
}
3.A4纵向打印,浏览器显示和打印效果相差不大,设置body的宽度
body{
width:640px;
font-size:12px;
}
4.css擅长样式的控制,table善于格式的显示。css修饰table
参考文章:http://www.w3schools.com/css/css_table.asp
table添加边框
table{
border-collapse:collapse;
}
table, th, td{
border:1px solid #000000;
}
如果一个页面有多个table,这个table和其他table格式略有不同,可以使用下面的方法
<div id="t1">
<table>
<tr>
<th scope="col"> </th>
</tr>
</table>
</div>
css中,控制不同的格式
#t1 table{
width:640px;
}
#t1 table,#t1 th,#t1 td{
text-align:center;
}
5.控制打印时是否显示
@media print{<!--控制哪些打印,哪些不打印的样式-->
.print {display:block;}
.notPrint {display:none;}
}
我们在html中引入css: <link rel=”stylesheet” type=”text/css” media=”screen” href=”styles/basic.css” />
media=”screen”,也可以时media=”print”,分别代表控制浏览器里面的格式,或者打印时的格式,如果没有写media属性,则表示css既控制浏览器显示,有控制打印显示,
所以上面的css就是单独控制打印的
–
文字间距 行间距
.space{
word-spacing:20px;
letter-spacing:20px;
line-height:60px;
}
–EOF–
jfreechart使用小结
一些jfreechart的api:http://topic.csdn.net/t/20050925/03/4292228.html
要建立类似下面的报表(折线图和柱状图都存在,图片不好贴,直接给个flicckr地址):http://www.flickr.com/photos/44025540@N03/4241013620/

先贴段代码,用到的地方尽量加载注释里:
package com.wasw100.chart;
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
/**
*
* @author wasw100
*
*/
public class ChartTest {
/**
* @param stuScoreMap
* @return
*/
private static DefaultCategoryDataset getDataSet(
Map<String, Number> scoreMap, String category) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// 遍历Map
for (String key : scoreMap.keySet()) {
double value = scoreMap.get(key).doubleValue();
dataset.setValue(value, category, key);
}
return dataset;
}
/**
*
* @param stuScoreMap
* 学生成绩
* @param avgScoreMap
* 班级平均成绩
* @return
*/
private static JFreeChart getChart(Map<String, Number> stuScoreMap,
Map<String, Number> avgScoreMap) {
CategoryPlot categoryPlot = new CategoryPlot();
// 横轴、纵轴显示的标题
categoryPlot.setDomainAxis(new CategoryAxis(""));
categoryPlot.setRangeAxis(new NumberAxis("分数"));
// 显示的方向,横向还是纵向?
// categoryPlot.setOrientation(PlotOrientation.VERTICAL);
// 设置是否显示水平网格线
categoryPlot.setRangeGridlinesVisible(true);
// 设置是否显示垂直网格线
// categoryPlot.setDomainGridlinesVisible(true);
DefaultCategoryDataset avgData = getDataSet(avgScoreMap, "班级平均成绩");// 得到数据集
LineAndShapeRenderer lineAndShapeRenderer = new LineAndShapeRenderer();
// 不显示线条
lineAndShapeRenderer.setBaseLinesVisible(false);
// 将线条添加进图表
categoryPlot.setRenderer(lineAndShapeRenderer);
categoryPlot.setDataset(avgData);
// lineAndShapeRenderer的数值显示出来
StandardCategoryItemLabelGenerator standardcategoryitemlabelgenerator = new StandardCategoryItemLabelGenerator();
lineAndShapeRenderer
.setBaseItemLabelGenerator(standardcategoryitemlabelgenerator);
lineAndShapeRenderer.setBaseItemLabelsVisible(true);
// 个人成绩的添加
DefaultCategoryDataset stuData = getDataSet(stuScoreMap, "成绩");// 得到数据集
BarRenderer barRenderer = new BarRenderer();// 柱状图渲染器
categoryPlot.setDataset(1, stuData);
categoryPlot.setRenderer(1, barRenderer);
// 颜色显示为黄色
barRenderer.setSeriesPaint(0, Color.YELLOW);
barRenderer.setShadowVisible(false);
// barRenderer.setSeriesPaint(0, new Color(0, 0, 255));
// 显示边框
barRenderer.setDrawBarOutline(true);
barRenderer.setBaseOutlinePaint(Color.GRAY);
// 设置纵轴的最小值和最大值
ValueAxis valueAxis = categoryPlot.getRangeAxis();
valueAxis.setLowerBound(40);
valueAxis.setUpperBound(110);
JFreeChart chart = new JFreeChart(categoryPlot);
// 设置title
Font titleFont = new Font("黑体", Font.BOLD, 10); // 图片标题
chart
.setTitle(new TextTitle("高2011级6班在高一下期末的平均成绩与班级平均成绩的比较",
titleFont));
chart.setBackgroundPaint(Color.WHITE);
return chart;
}
public static void main(String[] args) {
Map<String, Number> avgScoreMap = new LinkedHashMap<String, Number>();
avgScoreMap.put("总分", 0);
avgScoreMap.put("语文", 97.02);
avgScoreMap.put("数学", 73.71);
avgScoreMap.put("英语", 77.9);
avgScoreMap.put("理综", 0);
avgScoreMap.put("物理", 52.73);
avgScoreMap.put("化学", 66.98);
Map<String, Number> stuScoreMap = new LinkedHashMap<String, Number>();
stuScoreMap.put("总分", 0);
stuScoreMap.put("语文", 98);
stuScoreMap.put("数学", 70);
stuScoreMap.put("英语", 50);
stuScoreMap.put("理综", 0);
stuScoreMap.put("物理", 50);
stuScoreMap.put("化学", 70);
JFreeChart chart = getChart(avgScoreMap, avgScoreMap);
FileOutputStream fos_jpg = null;
try {
fos_jpg = new FileOutputStream("D:\\score.jpg");
ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos_jpg.close();
} catch (IOException e) {
}
}
}
}
还有就是图例如果显示在右面,可以这样设置
// 设置图例位置,字体
chart.getLegend().setPosition(RectangleEdge.RIGHT);
Font kfont = new Font("宋体", Font.PLAIN, 10);
chart.getLegend().setItemFont(kfont);
还没有解决的问题:
1.右侧刻度间距没有手动控制
2.柱状图中间的白色竖线去不掉,欢迎指点
补充:刻度手动控制解决,只要把上面99-102行的代码改为下面即可
// 数据轴精度 NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis(); numberAxis.setTickUnit(new NumberTickUnit(10)); numberAxis.setLowerBound(0); numberAxis.setUpperBound(110);
NumberAxis继承ValueAxis,所以ValueAxis有得属性方法, NumberAxis都可以使用。
–EOF–