wasw100's Blog
2012/02/23

Google AD

2010年01月26日

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–

2010年01月21日

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

3、java报表JXL和POI打印设置

代码在附件中,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–

2010年01月18日

网页打印格式设置总结

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">&nbsp;</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–

2010年01月3日

jfreechart使用小结

参考文章:使用 JFreeChart来创建基于web的图表

一些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–

返回顶部