ブラウザからwordドキュメントをエクスポートし、画像と表を含む

5268 ワード

この文書では、次の文書を参照してください.
1、javaがwordをエクスポートする5つの方法https://blog.csdn.net/zi_wu_xian/article/details/80320520 
2、jfreechartは各種図を形成するhttps://blog.csdn.net/chehec2010/article/details/81026789
3、jFreeChart詳細属性まとめhttps://blog.csdn.net/it_lihongmin/article/details/50469212
4、Java iTextを使ってwordファイルを生成する完璧な解決方案https://blog.csdn.net/matinbell/article/details/73088948
5、iTextを使用してwordドキュメントに複雑なTableテーブルを挿入するhttps://blog.51cto.com/116833/1688695
6、ITEXTケーブルのセルボーダー設定https://blog.csdn.net/cfup_less/article/details/82686426
需要説明
データベースから検索したデータをブラウザからwordドキュメントにエクスポートする必要があります.ドキュメントには折れ線図、円グラフ、表、文字などが含まれています.
一、大まかな考え方
最初に作ったとき、需要の最大の問題は、wordに折れ線図と餅状図を描くための第三者のプラグインを見つけることができるかどうかだと思っていましたが、その後、ネットで資料を探して(文章1を参照)、最後に比較と比較を経て、第三者のプラグインを使って必要な折れ線図と餅状図を作ることにしました.そしてwordに画像を挿入する方式で実現します.
二、使用するプラグイン
itextとitext-rtfを使用してwordドキュメントを操作し、jfreechartを使用して様々なグラフを生成します.次に、itextの2つのjarパッケージのバージョンが常に使用されるjar maven依存性を示します.
		
		    org.jfree
		    jfreechart
		    1.0.19
		
        
			com.lowagie
			itext
			2.1.7
			jar
		
		
		
		    com.lowagie
		    itext-rtf
		    2.1.7
		

三、コード展示
使用するコードは基本的にネットで探して、それから自分の具体的な需要によって更に改造します.(詳しく見る時間がないことを許してください)、この文章を書くのも使った知識をまとめるためで、それから物をまとめて、後で使うのに便利です.
1、画像を生成する
この部分のコード主体は主に次の2つの文章を参考にして、それからこれに基づいて改造しました.
https://blog.csdn.net/chehec2010/article/details/81026789
https://blog.csdn.net/it_lihongmin/article/details/50469212
改造の過程で出会ったいくつかの問題を話してください.
まず、複数の折れ線図を生成するため、かつ複数の折れ線図Y軸の取値範囲の差も大きく、一定値として書くことができないため、折れ線図の目盛り取値問題である.そこで私は1種の構想を考えて、すべての値は和を求めてそれから平均数を求めて、更に半分の値を取ります.しかし、このように取った値には小数点があり、個位10位には値があります.例えば5.831453.5など、目盛り線の値は整百整十のほうがいいです.そして私はまたコードを通じてもう一度値を取りました.平均数の範囲を判断し,次いで基数を与え,この操作を先に除いて乗算することで整数値を得ることが考えられる.次はコードです
    		int num = ((int)sum/2)/list.size();
    		int radix = 0;
    		if (num < 10) {
    			radix = 1;
    		} else if (num >= 10 && num < 100) {
    			radix = 10;
    		} else if (num >= 100 && num < 1000) {
    			radix = 100;
    		} else if (num >= 1000 && num < 10000) {
    			radix = 1000;
    		} else if (num >= 10000 && num < 100000) {
    			radix = 10000;
    		} else if (num >= 100000 && num < 1000000) {
    			radix = 100000;
    		} else if (num >= 1000000 && num < 10000000) {
    			radix = 1000000;
    		} else {
    			radix = 5000000;
    		}
    		 tick= num / radix * radix;

 
また、図例の文字化けしの問題は、長い間探していたので、図例の字にフォントを再設定することで解決できます.
折れ線:
//横軸
Font labelFont=new Font(「宋に倣う」,Font.TRUETYPE_FONT,18);        CategoryAxis domainAxis = categoryplot.getDomainAxis();         domainAxis.setLabelFont(labelFont);//軸ヘッダー
たてざひょう
        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();         numberaxis.setLabelFont(labelFont);
円グラフ:
        StandardChartTheme standardChartTheme=new StandardChartTheme("CN");          standardChartTheme.setRegularFont(new Font(「宋書」,Font.PLAIN,8));          ChartFactory.setChartTheme(standardChartTheme);
2、wordドキュメントの生成
wordドキュメントを生成する際、主に次の文章を参考にしました.
 https://blog.csdn.net/matinbell/article/details/73088948
出会ったいくつかの問題を話してください.
①ドキュメントを生成するページの余白のコントロールが悪く、ページ全体がほぼ埋まっていたが、その後、資料を照会することで、いくつかのことが分かった.
ドキュメントの生成時にDocument document=new Document(PageSize.A 4,90,90,72,72);左右の境界を設けることができ、90と72は基本的に共通のA 4紙のマージンサイズです.
②wordドキュメントのフォントをどのように設定するか、ほとんどのネット上のチュートリアルでは、ローカルのcディスクのWindowsライブラリからrtfファイルを直接持たせることができますが、私はどのように試してもだめで、最後に1つの方法を見つけました.
RtfFont font=new RtfFont(「宋に倣う」,12,Font.NORMAL,Color.BLACK);
フォントは宋の間にスペースがあることに注意してください.
③ブラウザでエクスポートしたので、バイトストリームをresponseに出力してブラウザに戻し、BufferedOutputStreamでresponseの出力ストリームをパッケージングし、RtfWriter 2でwordドキュメントを書く
		OutputStream os = null;
		response.reset();
		response.setHeader("Content-Disposition", "attachment;filename="
				+ new String((cityString+"    "+simdf.format(new Date()) + ".doc").getBytes("gbk"),"iso8859-1"));
		//response.setHeader("Content-Length", "" + file.length());
		os = new BufferedOutputStream(response.getOutputStream());
		response.setContentType("application/xml");

		String path = "E:\\test\\";// word               
 		if(System.getProperty("os.name").toLowerCase().startsWith("linux")){
 			path ="/home/Tomcat/temp/";
	 		File file = new File(path);
 			if (!file.exists()) {
				file.mkdir();
			}
 		}
		
		DateFormat sFormat = new SimpleDateFormat("yyyy MM ");
		DateFormat sFormat1 = new SimpleDateFormat("yyyy-MM");
		Document document = new Document(PageSize.A4,90,90,72,72);
		
		//   rtf   word   
		RtfWriter2.getInstance(document, os); 
		document.open();

④tableとtableセルの枠線設定については、次の2つの記事を参照してください
https://blog.51cto.com/116833/1688695
https://blog.csdn.net/cfup_less/article/details/82686426