2018年2月7日 星期三

[程式類]Aspose如何將樣板WORD插入多筆來自資料庫(Blob)的圖片

Aspose word是一個非常好用的文件產生器, 像是要在本文填入文字, 就要利用WORD
按一下 [插入] > [快速組件] > [功能變數]
[快速組件] 功能表上的 [插入功能變數] 選項。

在左方功能變數名稱選擇MergeField, 在欄位名稱填入例如: NAME 後按下確定
«NAME»

這是WORD裡的功能變數裡的顯示。

而在程式裡C#為例:
        Document docTemplate = new Document(ExportFile);

        DataTable mainTbHeader = new DataTable();
        mainTbHeader.Columns.Add("NAME");     

        DataRow mainDr = mainTbHeader.NewRow();
        mainDr["NAME"] = "NAME1";
        mainTbHeader.Rows.Add(mainDr);
        docTemplate.MailMerge.Execute(mainTbHeader);
        docTemplate.Save(ExportFile);
這樣檔案裡就會照著你的意思,有一文字ASPOSE。

以上為Aspose裡插入文字時的做法。

那如果是多筆文字的話在Word Tamplate要使用TableStart/TableEnd 如下所示:
«TableStart:NameList»
     «Name»
«TableEnd:NameList»

在程式中
DataTable NameList = new DataTable("NameList");

        NameList.Columns.Add("Name");

        // set row data 
DataRow dr = NameList.NewRow();
        dr["Name"]="Name1";
        NameList.Rows.Add(dr);

dr["Name"]="Name2";
NameList.Rows.Add(dr);

ds.Tables.Add(NameList );
        docTemplate.MailMerge.ExecuteWithRegions(ds);
這樣便可以將多筆資料內容,一筆一筆的填入。

重點來了, 本旨想要解釋的圖片呢?
Word Tamplate要使用Table,這一點和上面多筆文字內容一樣要使用table, 但是在Word的功能變數內容有些不同。如果是圖面要使用[Image:]這個特別的識別Tag
«TableStart:NAMELIST»
     «NAME»
     «Image:Picture»
«TableEnd:NAMELIST»

在程式中
        DataTable NameList = new DataTable("NameList");

        NameList.Columns.Add("Name");
        NameList.Columns.Add("Picture", typeof(Byte[]));// Byte Image

        // set row data 
        DataRow dr = NameList.NewRow();
        dr["Name"] = "Name1";
        byte[] myByteArray = GetImageFile(PK); //try to get the Image file
        dr["Picture"] = myByteArray;
        NameList.Rows.Add(dr);

        dr["Name"] = "Name2";
        byte[] myByteArray = GetImageFile(PK2); //try to get the Image file
        dr["Picture"] = myByteArray;
        NameList.Rows.Add(dr);

        ds.Tables.Add(NameList);
        docTemplate.MailMerge.ExecuteWithRegions(ds);

        //this part for Bind Image
        DocumentB起彼落uilder builder = new DocumentBuilder(docTemplate);
        ReportingEngine engine = new ReportingEngine();

        engine.BuildReport(docTemplate, ds, "ds");

請加入此Class
public class HandleMergeImageFieldFromBlob : IFieldMergingCallback
{
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
    {

    }

    /// <summary>
    /// This is called when mail merge engine encounters Image:XXX merge field in the document.
    /// You have a chance to return an Image object, file name or a stream that contains the image.
    /// </summary>
    void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs e)
    {
        if (e.FieldValue == null || e.FieldValue is System.DBNull) return;
        // The field value is a byte array, just cast it and create a stream on it.

        MemoryStream imageStream = new MemoryStream((byte[])e.FieldValue);
        // Now the mail merge engine will retrieve the image from the stream.

        e.ImageStream = imageStream;

        e.ImageHeight.Value = 166;
        e.ImageWidth.Value = 250;
    }
}

2017年12月5日 星期二

[程式類]C# 產生HTML的行事曆格式 how to create a calendar in html.

有時只是想要在網頁上顯示一個月有哪些內容~並不是真正的要搞個行事曆系統出來, 此時可以用用這個,只是產出HTML語法; 丟到client端上的某個table 的 innerHTML 就可以了~

this function just generates the HTML of a calendar.  Using <table> <tr><td> tag.



public string GetCalendarDetail(string tmpYear, string tmpMonth)
{
string tmpStr = "";

tmpYear = "2017";
tmpMonth = "12";

int MonthDayCount = DateTime.DaystmpMonth(int.Parse(tmpYear), int.Parse(tmpMonth));

tmpStr = "<table class='table table-bordered my_table my_class_table'><tr style='height:13px;font-size:16px;'>";

int i, j, tmpDay = 1;
DateTime tmpDate;
int StartWeekDay = Convert.ToInt16(Convert.ToDateTime(tmpYear + "/" + tmpMonth + "/01").DayOfWeek);
tmpDay = tmpDay - StartWeekDay;
for (j = 1; j <= StartWeekDay; j++)
{
tmpStr += "<td></td>";
}
j = j - 1;
for (i = 1; i <= MonthDayCount; i++)
{
//Head
tmpDate = Convert.ToDateTime(tmpYear + "/" + tmpMonth + "/" + i);
if ((i + j) % 7 == 1)
{
tmpStr += "</tr>";
//Body
if (StartWeekDay == 0 && i == 1)
tmpStr = tmpStr.Replace("<tr style='height:13px;font-size:16px;'></tr>", "");
else
{
tmpStr += "<tr style='height:70px;font-size:12px;'>";
for (int k = 1; k <= 7; k++, tmpDay++)
{
tmpStr += "<td>";
if (tmpDay >= 1 && tmpDay <= MonthDayCount)
{
//tmpDaty is the Date
tmpStr += tmpDay.ToString();
}
tmpStr += "</td>";
}
tmpStr += "</tr>";
}
}
tmpStr += "<td>" + tmpDate.ToString("MM/dd") + "(" + tmpDate.DayOfWeek.ToString() + ")</td>";
}

//fill the qup
if (i + StartWeekDay <= 36)
for (int x = i + StartWeekDay; x <= 35; x++)
tmpStr += "<td></td>";
else if (i + StartWeekDay > 36)
for (int x = i + StartWeekDay; x <= 42; x++)
tmpStr += "<td></td>";

tmpStr += "<tr style='height:70px;font-size:12px;'>";
for (int k = 1; k <= 7; k++, tmpDay++)
{
tmpStr += "<td>";
if (tmpDay >= 1 && tmpDay <= MonthDayCount)
{
//tmpDaty is the Date
tmpStr += tmpDay.ToString();
}
tmpStr += "</td>";
}
tmpStr += "</tr>";

tmpStr += "</td></table>";

return tmpStr;
}

2017年5月11日 星期四

笑話一則「研究不懂事的真懂事」

一日,邊開車邊聽著電台裡的理財談話節目....

主持人說著就介紹起接下來的主講人,

接下來,讓我們歡迎「研究不懂事的真懂事」來為我們說明...○=X?◆

(哪招?)

(心想: 不懂事還要研究哦?)  

(而且還要特別說是"真"的很懂事...)

.
.
.
.
我恍然大悟..

是研究部裡的某位董事, 曾姓董事來說明啦.......

..

生活中常常會有這種猛聽,就怪怪的稱號,好像都在簡稱中出現...

像在公司中的鐘協  (中邪)....等等

搏君一笑~