目錄制作的幾種方法:
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括昂仁網(wǎng)站建設(shè)、昂仁網(wǎng)站制作、昂仁網(wǎng)頁(yè)制作以及昂仁網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,昂仁網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到昂仁省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
一.從標(biāo)題樣式創(chuàng)建目錄的操作步驟是:
(1)把光標(biāo)移到要移到目錄的位置。一般是創(chuàng)建在該文檔的開(kāi)頭或者結(jié)尾。
(2)單擊【插入】|【引用】|【索引和目錄】選項(xiàng),并在彈出的【索引和目錄】對(duì)話框選擇【目錄】選項(xiàng)卡,打開(kāi)【索引和目錄】對(duì)話框。
(3)在【格式】列表框中選擇目錄的風(fēng)格,選擇的結(jié)果可以通過(guò)【打印預(yù)覽】框來(lái)查看。如果選擇【來(lái)自模板】選項(xiàng),標(biāo)識(shí)使用內(nèi)置的目錄樣式(目錄1到目錄9)來(lái)格式化目錄。如果要改變目錄的樣式,可以單擊【修改】按鈕,按更改樣式的方法修改相應(yīng)的目錄樣式。并且只有選擇【來(lái)自模板】選項(xiàng)時(shí),【修改】按鈕才有效。
(4)如果要在目錄中每個(gè)標(biāo)題后面顯示頁(yè)碼,應(yīng)選擇【顯示頁(yè)碼】復(fù)選框。
(5)如果選中【頁(yè)碼右對(duì)齊】復(fù)選框,則可以讓頁(yè)碼右對(duì)齊。
(6)在【顯示級(jí)別】列表框中指定目錄中顯示的標(biāo)題層次。一般只顯示3級(jí)目錄比較恰當(dāng)。
(7)在【制表符前導(dǎo)符】列表框中指定標(biāo)題與頁(yè)碼之間的制表位分隔符。
(8)單擊【確定】按鈕
二.由目錄域創(chuàng)建目錄,操作方法如下:
(1)在文檔中將包含目錄的文字標(biāo)題選中。
(2)按快捷鍵alt+shift+o。打開(kāi)【標(biāo)記目錄項(xiàng)】對(duì)話框。
(3)在【級(jí)別】框中,選擇目錄的級(jí)別,如1,2,3等級(jí)別。并單擊【標(biāo)記】按鈕。
(4)不退出對(duì)此對(duì)話框,選擇第二個(gè)文字標(biāo)題,當(dāng)切換【標(biāo)記目錄項(xiàng)】對(duì)話框?yàn)榛顒?dòng)窗口時(shí),該選定的文本就會(huì)出現(xiàn)在【目錄項(xiàng)】文本框中。
繼續(xù)標(biāo)記直到完成。當(dāng)標(biāo)記完所有需要?jiǎng)?chuàng)建的目錄文本后,此時(shí)該對(duì)話框中的【取消】按鈕將變成【關(guān)閉】按鈕,單擊【關(guān)閉】按鈕退出。
(5)將光標(biāo)移到要插入目錄的位置(一般是文檔的開(kāi)頭或結(jié)尾處)。
(6)單擊【插入】|【引用】|【索引和目錄】命令。
(7)單擊【目錄】選項(xiàng)卡。
(8)單擊【選項(xiàng)】按鈕。
(9)在【目錄選項(xiàng)】框中,選中【目錄項(xiàng)域】復(fù)選框。并且清除【樣式】和【大綱級(jí)別】復(fù)選框。
(10)連續(xù)單擊【確定】按鈕即可使用目錄域創(chuàng)建目錄,即可在指定的地方插入了由目錄域創(chuàng)建的目錄。
首先是action的createDoc方法:
[java]
/**
* 通過(guò)HttpCient調(diào)用報(bào)告服務(wù)器的方法生成報(bào)告 DOC
*/
public String createDoc() throws Exception {
//定義放回成功與否的判斷碼
String prMsg="";
// 獲取當(dāng)前登錄的用戶
UserVo userVo = CommonUtils.getUserMessage();
//獲取模版類(lèi)型
docType = Struts2Utils.getParameter("docType");
//重新創(chuàng)建文檔
String creatOrnot = Struts2Utils.getParameter("creatOrnot");
//獲取組組編號(hào)參數(shù)
workgroupId = Struts2Utils.getParameter("workgroupId");
//獲取評(píng)估用例實(shí)例ID參數(shù)
evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId");
if(CommonUtils.isNotNull(docType)){
//獲取項(xiàng)目Id
projectId = Struts2Utils.getParameter("projectId");
if(!CommonUtils.isNotNull(projectId)){
if(CommonUtils.isNotNull(this.getIdFromSession("PM_PROJECTID"))){
projectId = this.getIdFromSession("PM_PROJECTID").toString();
}else{
Struts2Utils.getRequest().setAttribute("msg", "請(qǐng)先選擇項(xiàng)目!");
}
}
if(CommonUtils.isNotNull(projectId)){
prMsg = infoSystemDescService.downloadFileByUrl(projectId, userVo.getUserId(), workgroupId, evtcaseInstId, docType, creatOrnot);
}
}
return "docList";
}
注:在我貼出來(lái)的代碼中,能看懂就行了,有些不用管他(可能是其他業(yè)務(wù)方面的判斷),關(guān)于最后返回的prMsg---代表各種狀態(tài) 主要表示成功與否或者是出錯(cuò)的信息。
接著我貼出service層的方法downloadFileByUrl
[java]
/prep/pp/ppre name="code" class="java"pre name="code" class="java"/**
* 功能:
* 1.(生成報(bào)告文檔)
* 2.保存指定URL的源文件到指定路徑下
* @param projectId
* @param userId
* @param workgroupId
* @param evtcaseInstId
* @param docType
* @param creatOrnot
* @return
* @throws Exception
*/
@SuppressWarnings("deprecation")
public synchronized String downloadFileByUrl(String projectId,String userId,String workgroupId,String evtcaseInstId,String docType,String creatOrnot) throws Exception {
String msg = "1";//"1":默認(rèn)為創(chuàng)建成功的提示信息 "2":標(biāo)識(shí)創(chuàng)建失敗
String srcUrl = ""; //報(bào)告服務(wù)器的執(zhí)行路徑
HttpResponse response = null;
FileOutputStream out = null;
HttpClient httpclient = null;
HttpGet httpget = null;
long time1 = System.currentTimeMillis();
//獲取保存后的路徑
TProjDoc projDoc = projectDocDao.findFileByType(userId, Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
if(projDoc == null || (projDoc != null CommonUtils.isNotNull(creatOrnot) creatOrnot.equals("1"))){ //FT_任務(wù)編號(hào)_[FID]
try {
//獲取報(bào)告服務(wù)器的執(zhí)行路徑
srcUrl = xmlPathDef.getActionUrl(docType, projectId,userId,workgroupId,evtcaseInstId);
HttpParams httpParams = new BasicHttpParams();
// 設(shè)置最大連接數(shù)
ConnManagerParams.setMaxTotalConnections(httpParams, 1);
// 設(shè)置獲取連接的最大等待時(shí)間
//ConnManagerParams.setTimeout(httpParams, 6000);
// 設(shè)置每個(gè)路由最大連接數(shù)
ConnPerRouteBean connPerRoute = new ConnPerRouteBean(1);
ConnManagerParams.setMaxConnectionsPerRoute(httpParams,connPerRoute);
// 設(shè)置連接超時(shí)時(shí)間
HttpConnectionParams.setConnectionTimeout(httpParams, 6000);
// 設(shè)置讀取超時(shí)時(shí)間
if(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) docType.toString().equals(XmlPathDef.FTEST_DOC)){
HttpConnectionParams.setSoTimeout(httpParams, 2400000);
}else{
HttpConnectionParams.setSoTimeout(httpParams, 600000);
}
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(httpParams, registry);
httpclient = new DefaultHttpClient(connectionManager, httpParams);
httpget = new HttpGet(srcUrl);
//執(zhí)行返回
response = httpclient.execute(httpget);
//如果是本機(jī)既當(dāng)服務(wù)器,又當(dāng)報(bào)表服務(wù)器,那么就只生成一遍
String ipvalues = xmlPathDef.getRepUrl();
if(CommonUtils.isNotNull(ipvalues)){
if(ipvalues.indexOf(":") != -1){
ipvalues = ipvalues.substring(0,ipvalues.lastIndexOf(":"));
}
}
HttpEntity entity = response.getEntity();
//獲取保存后的路徑
projDoc = projectDocDao.findFileByType(userId,Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
String filePath = "";
if(projDoc != null)
filePath = projDoc.getPath();
if(CommonUtils.isNotNull(filePath)){
String basepath = XmlPathDef.getBasePath();
String outFilePath = (basepath + filePath).replaceAll("\\\\", "\\/");
XmlPathDef.isExists(outFilePath);
File wdFile = new File(outFilePath);
out = new FileOutputStream(wdFile);
int l;
byte[] tmp = new byte[2048];
while ((l = instream.read(tmp)) != -1) {
out.write(tmp, 0, l);
}
out.flush();
out.close();
System.out.println("****************************** ");
System.out.println("");
System.out.println("*************** 恭喜! 報(bào)告創(chuàng)建成功 結(jié)束 ***************");
System.out.println("");
}else{
msg = "8";//說(shuō)明word創(chuàng)建成功,但是數(shù)據(jù)沒(méi)有保存成功
response = null;
}
}else{
msg = "2";
}
} catch (ClientProtocolException e) {
msg = "7";
e.printStackTrace();
} catch (IOException e) {
msg = "7";
logger.error("數(shù)據(jù)庫(kù)報(bào)告服務(wù)器地址配置錯(cuò)誤或網(wǎng)絡(luò)不通!!2.連接是否超時(shí)" + e.getMessage());
e.printStackTrace();
}finally{
if(out!=null){
try {
out.close();
} catch (IOException e) {
msg = "7";
logger.error("數(shù)據(jù)庫(kù)報(bào)告服務(wù)器地址配置錯(cuò)誤或網(wǎng)絡(luò)不通??!2.連接是否超時(shí)" + e.getMessage());
e.printStackTrace();
}
}
}
}
long time2 = System.currentTimeMillis();
long numTime = time2 - time1;
if(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) docType.toString().equals(XmlPathDef.FTEST_DOC)){
if(numTime = 2401000){
msg = "9";
}
}else{
if(numTime = 601000){
msg = "9";
}
}
System.out.println("");
String loggerinfo = "********* 報(bào)告類(lèi)型為 :" + docType + " 執(zhí)行時(shí)間為: " + (time2 - time1) /1000 + " 秒!***************";
System.out.println(loggerinfo);
System.out.println("");
System.out.println("*****************************");
logger.info(loggerinfo);
return msg;
}
java導(dǎo)出word代碼如下:
package com.bank.util;
import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;
public class WordTools {
public void createDocContext(String file) throws DocumentException,
IOException {
// 設(shè)置紙張大小
Document document = new Document(PageSize.A4);
// 建立一個(gè)書(shū)寫(xiě)器(Writer)與document對(duì)象關(guān)聯(lián),通過(guò)書(shū)寫(xiě)器(Writer)可以將文檔寫(xiě)入到磁盤(pán)中
RtfWriter2.getInstance(document, new FileOutputStream(file));
document.open();
// 設(shè)置中文字體
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 標(biāo)題字體風(fēng)格
Font titleFont = new Font(bfChinese, 12, Font.BOLD);
// 正文字體風(fēng)格
Font contextFont = new Font(bfChinese, 10, Font.NORMAL);
Paragraph title = new Paragraph("標(biāo)題");
// 設(shè)置標(biāo)題格式對(duì)齊方式
title.setAlignment(Element.ALIGN_CENTER);
title.setFont(titleFont);
document.add(title);
String contextString = "iText是一個(gè)能夠快速產(chǎn)生PDF文件的java類(lèi)庫(kù)。"
+ " \n"http:// 換行
+ "iText的java類(lèi)對(duì)于那些要產(chǎn)生包含文本,"
+ "表格,圖形的只讀文檔是很有用的。它的類(lèi)庫(kù)尤其與java Servlet有很好的給合。"
+ "使用iText與PDF能夠使你正確的控制Servlet的輸出。";
Paragraph context = new Paragraph(contextString);
// 正文格式左對(duì)齊
context.setAlignment(Element.ALIGN_LEFT);
context.setFont(contextFont);
// 離上一段落(標(biāo)題)空的行數(shù)
context.setSpacingBefore(5);
// 設(shè)置第一行空的列數(shù)
context.setFirstLineIndent(20);
document.add(context);
//利用類(lèi)FontFactory結(jié)合Font和Color可以設(shè)置各種各樣字體樣式
/**
* Font.UNDERLINE 下劃線,F(xiàn)ont.BOLD 粗體
*/
Paragraph underline = new Paragraph("下劃線的實(shí)現(xiàn)", FontFactory.getFont(
FontFactory.HELVETICA_BOLDOBLIQUE, 18, Font.UNDERLINE,
new Color(0, 0, 255)));
document.add(underline);
// 設(shè)置 Table 表格
Table aTable = new Table(3);
int width[] = {25,25,50};
aTable.setWidths(width);//設(shè)置每列所占比例
aTable.setWidth(90); // 占頁(yè)面寬度 90%
aTable.setAlignment(Element.ALIGN_CENTER);//居中顯示
aTable.setAlignment(Element.ALIGN_MIDDLE);//縱向居中顯示
aTable.setAutoFillEmptyCells(true); //自動(dòng)填滿
aTable.setBorderWidth(1); //邊框?qū)挾?/p>
aTable.setBorderColor(new Color(0, 125, 255)); //邊框顏色
aTable.setPadding(0);//襯距,看效果就知道什么意思了
aTable.setSpacing(0);//即單元格之間的間距
aTable.setBorder(2);//邊框
//設(shè)置表頭
/**
* cell.setHeader(true);是將該單元格作為表頭信息顯示;
* cell.setColspan(3);指定了該單元格占3列;
* 為表格添加表頭信息時(shí),要注意的是一旦表頭信息添加完了之后, \
* 必須調(diào)用 endHeaders()方法,否則當(dāng)表格跨頁(yè)后,表頭信息不會(huì)再顯示
*/
Cell haderCell = new Cell("表格表頭");
haderCell.setHeader(true);
haderCell.setColspan(3);
aTable.addCell(haderCell);
aTable.endHeaders();
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL, Color.GREEN);
Cell cell = new Cell(new Phrase("這是一個(gè)測(cè)試的 3*3 Table 數(shù)據(jù)", fontChinese ));
cell.setVerticalAlignment(Element.ALIGN_TOP);
cell.setBorderColor(new Color(255, 0, 0));
cell.setRowspan(2);
aTable.addCell(cell);
aTable.addCell(new Cell("#1"));
aTable.addCell(new Cell("#2"));
aTable.addCell(new Cell("#3"));
aTable.addCell(new Cell("#4"));
Cell cell3 = new Cell(new Phrase("一行三列數(shù)據(jù)", fontChinese ));
cell3.setColspan(3);
cell3.setVerticalAlignment(Element.ALIGN_CENTER);
aTable.addCell(cell3);
document.add(aTable);
document.add(new Paragraph("\n"));
//添加圖片
// Image img=Image.getInstance("");
// img.setAbsolutePosition(0, 0);
// img.setAlignment(Image.RIGHT);//設(shè)置圖片顯示位置
// img.scaleAbsolute(12,35);//直接設(shè)定顯示尺寸
// img.scalePercent(50);//表示顯示的大小為原尺寸的50%
// img.scalePercent(25, 12);//圖像高寬的顯示比例
// img.setRotation(30);//圖像旋轉(zhuǎn)一定角度
// document.add(img);
document.close();
}
public static void main(String[] args){
WordTools b=new WordTools();
try {
b.createDocContext("d:/demo.doc");
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
首先,通過(guò)xml模板可以將基本上所有的格式都事先鎖定,包括頁(yè)碼和分頁(yè),只要你事先預(yù)設(shè)好就能夠通過(guò)freemarker實(shí)現(xiàn)生成,
接下來(lái)就是我這個(gè)問(wèn)題了,目錄怎么解決,下面是解決思路:
1:目錄的內(nèi)容可以根據(jù)之前其他的內(nèi)容一樣解決,通過(guò)xml模板預(yù)先設(shè)置好,
2:目錄的頁(yè)碼已經(jīng)研究過(guò)是不能直接通過(guò)xml模板實(shí)現(xiàn)動(dòng)態(tài)對(duì)應(yīng)了(至少我沒(méi)搞定0.0)
3:由于不能夠一步到位,我采取了在模板中預(yù)留了一頁(yè)空白頁(yè),只留了抬頭的目錄兩個(gè)字,然后通過(guò)查詢目錄二字進(jìn)行目錄的生成,
這個(gè)功能也是我剛剛折騰出來(lái)的0.0目前還沒(méi)測(cè)試能不能用模板生成目錄后再更新目錄0.0,不過(guò)想想可以直接生成目錄應(yīng)該就不用這么麻煩了,至于word生成后的修改0.0我覺(jué)得還是以后再說(shuō)吧.....
整體來(lái)說(shuō)應(yīng)該還算完美解決了,代碼我就不在這貼出來(lái)了~
雖然中間折騰了半天走了半天彎路~
講道理還是用的jacob來(lái)實(shí)現(xiàn)的。。