Membuka dokumen kata dari sharepoint, ganti teks dan streaming ke pengguna

Saya ingin dapat menyimpan dokumen Word templat di Sharepoint, dan menggunakannya sebagai dasar untuk mengeluarkan dokumen Word yang berisi data yang dimasukkan ke dalam templat.

Saya bisa mendapatkan teks dokumen Word saya menggunakan kode sebagai berikut:

    SPSite sc = SPContext.Current.Site; 
    SPWeb web = sc.AllWebs["MySite"];             

    string contents = web.GetFileAsString("Documents/MyTemplateWord.doc"); 

    web.Dispose(); 

Lalu saya bisa mengganti string pada variabel "isi". Ini berfungsi dengan baik.

Saya sekarang ingin "membuka" konten baru ini sebagai dokumen Word.

Kode saya untuk ini adalah sebagai berikut:

string attachment = "attachment; filename=MyWord.doc"; 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ClearHeaders(); 
    HttpContext.Current.Response.ClearContent(); 
    HttpContext.Current.Response.AddHeader("content-disposition", attachment); 
    HttpContext.Current.Response.ContentType = "text/ms-word"; 
    HttpContext.Current.Response.Write(outputText); 
    HttpContext.Current.Response.End(); 

Saya mendapatkan kesalahan, dan tidak yakin bagaimana cara mengatasinya.

Kesalahan: Sys.WebForms.PageRequestManagerParserErrorException: Pesan yang diterima dari server tidak dapat diuraikan. Penyebab umum kesalahan ini adalah ketika respons diubah oleh panggilan ke Response.Write(), filter respons, HttpModules, atau pelacakan server diaktifkan. Detail: Kesalahan penguraian di dekat 'ࡱ>

Sekarang jelas ada masalah dalam menguraikan konten "string".

Apa yang saya lakukan salah? Apakah ada cara lain yang harus saya lakukan?


person ozz    schedule 28.11.2011    source sumber


Jawaban (2)


Anda tidak membaca string, Anda mengonversi data biner menjadi string. (Ingat bahwa docx adalah file zip yang berisi data xml). Sifat pendekatan Anda untuk mengganti teks memiliki kelemahan dalam hal ini.

Jika bukan karena keinginan untuk mencari/mengganti teks, saya akan merekomendasikan

using(SPWeb web = new SPSite("<Site URL>").OpenWeb())
{
    SPFile file = web.GetFile("<URL for the file>");
    byte[] content = file.OpenBinary();
    HttpContext.Current.Response.Write(content);
}

http://support.microsoft.com/kb/929265 Menggunakan BinaryWrite untuk mendapatkan data halamanmu.

Namun, karena Anda menggunakan Word, saya sarankan memuat dokumen ke dalam instance Objek Microsoft.Office.Interop.Word. Namun, menggunakan interop Word bisa menjadi hal yang memakan waktu.

person Nat    schedule 28.11.2011

1- tambahkan rakitan docx ke paket shaepoint Anda https://docx.codeplex.com

2- menggunakan Novacode;

3- perhatikan contoh tombol unduh berikut

  protected void ButtonExportToWord_Click(object sender, EventArgs e)
        { 
            byte[] bytesInStream;

            using (Stream tplStream =
                SPContext.Current.Web.GetFile("/sitename/SiteAssets/word_TEMPLATE.docx").OpenBinaryStream())
            {
                using (MemoryStream ms = new MemoryStream((int)tplStream.Length))
                {
                    CopyStream(tplStream, ms);
                    ms.Position = 0L;

                    DocX doc = DocX.Load(ms);
                    ReplaceTextProxy(doc,"#INC#", "11111111");

                    doc.InsertParagraph("This is my test paragraph");

                    doc.Save();
                    bytesInStream = ms.ToArray();
                }
            }

            Page.Response.Clear();
            Page.Response.AddHeader("Content-Disposition", "attachment; filename=" +
                CurrentFormId + ".docx");
            Page.Response.AddHeader("Content-Length", bytesInStream.ToString());
            Page.Response.ContentType = "Application/msword";
            Page.Response.BinaryWrite(bytesInStream);

            Page.Response.Flush();
            Page.Response.Close();
            //Page.Response.End();// it throws an error
        }

        private void ReplaceTextProxy(DocX doc, string oldvalue, string newValue)
        {
            doc.ReplaceText(oldvalue,newValue,false, RegexOptions.None, null, null,
                        MatchFormattingOptions.SubsetMatch);
        }
person Iman    schedule 31.03.2014