最近的工作要用到一個要money的組件,aspose.word,通過這個可以把html頁面直接生成word文檔。當然,也有aspose.pdf等組件,對應的就是生成pdf格式的文件等。下面說說該組件運用過程中的一些問題。
首先,貼一段代碼出來:
private void button1_Click(object sender, EventArgs e)
{
string tpath = "resume.docx";
Document doc = new Document(tpath);
DocumentBuilder mybuilder = new DocumentBuilder(doc);
//通過書簽的形式向word模板中插入內容;
doc.Range.Bookmarks["resume_name"].Text = "我的簡歷";
doc.Range.Bookmarks["resume_id"].Text = "123456789987654321";
doc.Range.Bookmarks["update_time"].Text = "2022年12月22日";
doc.Range.Bookmarks["apply_state"].Text = "我正在主動找工作,可快速到崗";
//直接向word模板中插入html代碼,生成的word會自動編譯。
mybuilder.MoveToCell(0, 0, 0, 0);
mybuilder.InsertHtml("<font style='margin-top:20px;color:#bc4308;font-weight:bold;'>個人信息:</font><hr style='border-style:double;color:#bc4308;'/>");
//四個數字對應的是:第一張表,第一行,第一列,第一個字符之后。
mybuilder.MoveToCell(0, 1, 0, 0);
mybuilder.InsertHtml("<table><tr><td style='width:63pt;'>姓名:</td><td colspan='2'>李婷</td></tr><tr><td style='width:63pt;'>性別:</td><td colspan='2'>女</td></tr><tr><td style='width:63pt;'>學歷:</td><td colspan='2'>本科</td></tr><tr><td style='width:63pt;'>現居地:</td><td colspan='2'>鄭州市</td></tr><tr><td style='width:63pt;'>出生日期:</td><td colspan='2'>2010年12月20日</td></tr><tr><td rowspan='3' style='vertical-align:top;'>聯系方式:</td><td style='width:74pt;'>手機:</td><td style='width:173pt;'>15603900833</td></tr><tr><td style='width:74pt;'>家庭電話:</td><td style='width:173pt;'>0371-6027889</td></tr><tr><td style='width:74pt;'>辦公室電話:</td><td style='width:173pt;'>0371-62014547</td></tr></table>");
//插入圖片
Shape shape = new Shape(doc, ShapeType.Image);
shape.ImageData.SetImage("ziji.jpg");
shape.Width = 100;
shape.Height = 110;
shape.HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment.Center;//圖片向右對齊
mybuilder.MoveToCell(0, 1, 1, 0);
mybuilder.InsertNode(shape);
//讀文件
string s;
FileStream fs = new FileStream("1.html", FileMode.Open);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
s = sr.ReadToEnd();
sr.Close();
fs.Close();
mybuilder.MoveToCell(0, 2, 0, 0);
mybuilder.InsertHtml(s);//直接把文件流插入到word模板中
//插入頁尾
mybuilder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary);
Border topBorder = mybuilder.CellFormat.Borders[BorderType.Top];
topBorder.LineStyle = LineStyle.Single;
topBorder.LineWidth = 1;
mybuilder.InsertCell();
mybuilder.CellFormat.Width = 3 * 144;
mybuilder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
mybuilder.Write("公司名稱");
mybuilder.InsertCell();
mybuilder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
mybuilder.Write("日期");
mybuilder.EndRow();
mybuilder.EndTable();
//保存在test.doc文檔中。
doc.Save("test.doc", SaveFormat.Doc);
MessageBox.Show("已經完成!");
}
使用該組件的流程是:先做一個word模板,模板里面包含表格。然后在代碼中通過四個數值的定位在特定的表格里插入內容。
分為三種方式向word模板中插入內容。
一:通過在word模板中對應設置書簽,重命名書簽名稱,在代碼中根據書簽名稱,在特定位置插入特定內容;
二:插入圖片有兩種方式:(1)
//插入圖片
Shape shape = new Shape(doc, ShapeType.Image);
shape.ImageData.SetImage("ziji.jpg");
shape.Width = 100;
shape.Height = 110;
shape.HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment.Center;//圖片向右對齊
mybuilder.MoveToCell(0, 1, 1, 0);
mybuilder.InsertNode(shape);
這種方式插入圖片時,必須在word模板中做表格,定位表格位置,在特定位置插入圖。
最主要的是,圖片必須在項目文件夾中。
(2)通過插入一段html代碼。本來,我們以為直接插入html代碼,而項目中沒有圖片時,在斷網的情況下,圖片不能夠正常顯示。后來實踐證明,采用直接插入html代碼的方式插入圖片的方式下:在斷網的情況下,圖片是可以正常顯示的。
但是,這種方式的問題是:原圖有多大,生成的word中的圖片就有多大。不管html頁面的圖片大小,而是原圖的大小。
三:定位之后,直接插入html代碼。比如:
mybuilder.MoveToCell(0, 1, 0, 0);
mybuilder.InsertHtml("<table><tr><td style='width:63pt;'>姓名:</td><td colspan='2'>李婷</td></tr><tr><td style='width:63pt;'>性別:</td><td colspan='2'>女</td></tr><tr><td style='width:63pt;'>學歷:</td><td colspan='2'>本科</td></tr><tr><td style='width:63pt;'>現居地:</td><td colspan='2'>鄭州市</td></tr><tr><td style='width:63pt;'>出生日期:</td><td colspan='2'>2010年12月20日</td></tr><tr><td rowspan='3' style='vertical-align:top;'>聯系方式:</td><td style='width:74pt;'>手機:</td><td style='width:173pt;'>15603900833</td></tr><tr><td style='width:74pt;'>家庭電話:</td><td style='width:173pt;'>0371-6027889</td></tr><tr><td style='width:74pt;'>辦公室電話:</td><td style='width:173pt;'>0371-62014547</td></tr></table>");
這種方式時,需要注意的是,很多html中的標簽是不能夠如願地轉換成對應的word內容的。通過實踐發現:
(1)hr的樣式在word中是不管用的。注意是hr的樣式,而不是hr。
(2)br在word中不管用。
(3)div的border,在word中是不顯示的,但是它要占一個位置。
(4)p在word中只能顯示表示一行的效果,至於顏色或者大小之類的效果,必須用font標簽才能夠顯示。
(5)最重要的一點是:如果想直接把html轉換成word,要注意寬度等的設置,此時,就需要一個能夠同時在html和word中都管用的單位。因此,唯一的選擇是pt——磅值。而且,根據我這幾天的實踐,在word文檔中,選用五號字的情況下,一行有39個字。而對應的關系式是:五號=10.5磅=14px=0.37cm,因此,一行的寬度是410pt。設計html時,就直接用pt來控制寬度。可能剛開始時的寬度不是想象中的樣子,這個時候不要急,把所有的設置都按照計算寫對了,然后刷新頁面,就會給你一個驚喜,完全會是自己要的效果的。
還有一點很重要的要特別指出的是:我們在設計html頁面時,習慣性地只要設置每一列的第一個單元格的寬度,這一列下面的單元格就會自動采用這個寬度。但是,在采用aspose.word生成word時,這種方式生成的word中的大文本內容會不能夠完全顯示,顯示的效果是:文字好像浮在word頁面之上一樣,如果你把光標放在能看到的某一行的最后一個字符之前一個字符一個字符地往后移動光標,你就會發現文字藏在一個你根本無法找到的地方了。這個時候不要急,解決辦法是,給每個單元格都加上寬度。而且,必須采用這種方式:<td style='width:74pt;'>,而不要為了偷懶寫成這樣的方式:<td width='74pt'>。后一種方式是不能解決上面的問題的。如果,你生成的word大文本不能夠正常顯示,就仔細檢查你的html設計中,是不是少了一個<td style='width:74pt;'>,或者寫的方式不對。
以上總結完畢。如有新發現,及時更新。嘿嘿。
下面寫一點,這幾天工作中遇見的問題。
(1)文件的讀寫操作:
讀操作: string s;
FileStream fs = new FileStream("路徑", FileMode.Open);
StreamReader sr = new StreamReader(fs);
s= sr.ReadToEnd();
sr.Close();
fs.Close();
文件內容已經保存在s中了。
寫操作:FileStream fss=new FileStream("路徑",FileMode.Create)
StreamWriter sw=new StreamWriter(fss);
sw.Write("內容");
sw.Close();
fss.Close();
在此,感謝小飛飛,給我寫的這么清晰完整的代碼。哈哈。謝謝小飛飛同學了哈。
但是,在我的實際操作中遇見的問題是:讀出來的是亂碼,因此,必須設置編碼格式。因此,需要用到的代碼是:
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
在這里,我本來選擇是的是UTF8,后來證明UTF8讀出來的就是亂碼,因此,采用default的參數。
在此,感謝鳳凰同學。嘿嘿。
(2)關於table表格的合並拆分之類的html設計:我以前沒有寫過復雜的table,遇到復雜一點的就用多個table拆分了。終於,趁着這次工作的機會,把table中的一些寫法也弄懂了。嘿嘿。其實,超級簡單。我就是大懶漢啊。哈哈。
<table>
<tr>
<td style='width:63pt;'>姓名:</td>
<td colspan='2'>李婷</td>
</tr>
<tr>
<td style='width:63pt;'>性別:</td>
<td colspan='2'>女</td>
</tr>
<tr>
<td style='width:63pt;'>學歷:</td>
<td colspan='2'>本科</td>
</tr>
<tr>
<td style='width:63pt;'>現居地:</td>
<td colspan='2'>鄭州市</td>
</tr>
<tr>
<td style='width:63pt;'>出生日期:</td>
<td colspan='2'>2010年12月20日</td>
</tr>
<tr>
<td rowspan='3' style='vertical-align:top;'>聯系方式:</td>
<td style='width:74pt;'>手機:</td>
<td style='width:173pt;'>15603900833</td>
</tr>
<tr>
<td style='width:74pt;'>家庭電話:</td>
<td style='width:173pt;'>0371-6027889</td>
</tr>
<tr>
<td style='width:74pt;'>辦公室電話:</td>
<td style='width:173pt;'>0371-62014547</td>
</tr>
</table>
colspan='2';是合並列;
rowspan='3';是合並行;
style='vertical-align:top;' 這個是讓文本內容從單元格的最上面開始顯示;
(3)關於word的一些用法:本次工作中,需要在word中插入書簽。可是,我找了好久都沒有找到,在網上搜到的解答過於簡單,或者是我自己太笨吧。嘿嘿。廢話少說,word07中,最左上角word圖標——word選項——自定義——在“從下列位置選擇命令”中選擇“開發工具選項卡”——舊式工具,把舊式工具添加到自定義快速訪問工具欄即可。然后,在word的最上面,就可以看到這個圖標了:
,然后,單擊那個工具箱的圖標,就能看到這樣的效果了:
,然后,選擇這個
就可以添加書簽了。嘿嘿。
在此,感謝login同學。嘿嘿。
另:通過實踐發現,在使用書簽向word模板中插入內容時,書簽的最大長度設置是沒作用滴。嘿嘿。
