Asp.Net İle Word (.Doc) Belgesi Oluşturma ??
-
FileStream ile .doc uzantılı bir word belgesi oluşturabiliyrum.
Sorunum yazdırdığım içerğinin kenar boşluklarını ayarlayamıyorum.
Yani oluşturduğum word belgesi yazdırılmak istendiğinde, normal kenar boşluklu bir sayfa olarak yazdırdığı için içerik 2.sayfaya kayıyor. Word belgesinin kenar boşluklarını ayarlama ve sayfalar arası kesme koyma( iki sayfayı ayırmak için) imkanım var mı?
Word componentini kullanırsam bu sorunumu halledebilirmiyim bu konuyla ilgili bir makaleye rastlayan varsa paylaşırsa sevinirim?
dosyayı oluştururken yazdığım kodlar.
FileStream fs = new FileStream(Server.MapPath("~/belge/belge.doc"),FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.Write("<!DOCTYPE html PUBLIC '-//W3C//DTD ..."); // Tüm HTML'i olduğu gibi yazdırıyorum.
sw.Flush();
sw.Close();
-
worde oyle yazamassin. interop yada openxml kullanmalisin. her 2sinden de kenar bosluklarini ayarlayabilirsin ama her seferinde degismiyosa bu boyutlar, bos bir dosyada bu degisiklikleri yap ve kaydet sonra onu kullan (programatik olusturma yani)
-
senin yaptıgın sadece uzantıyı doc yapmak. wordle bunu açabilme sebebin wordun desteklemesi fakat senin dogru yaptıgından değil. öncelikle stringini düzgün bir formatta worde export etmelisin.bu sayede wordun özelliklerine hakim olabilirsin.bunun için bir kaç tane başarılı sınıf mevcut. openxml bu konuda oldukça başarılıdır.
http://msdn.microsoft.com/en-us/library/dd469465(office.12).aspx -
Interop ile yapabilirsin ancak tavsiye etmem. Sunucuda Office kurulu olması gerekiyor ve COM ile eriştiğin için her process için sunucuda Word açılıyor. OpenXML kullanabilirsin ancak çok karışık (en azından beni araştırdığım düzeyde işlemleri yapmak çok zordu) ama basit birşey için kullanabilirsin. Ayrıca 3rd party componentler var bu işler için (Mesela Aspose, Sprire.Doc).
-
Interopla istediğimi yaptım. Visiual Studio ile kendi bilgisayarımda da sunucuda da çalışıyor fakat iis'e attığım zaman bir web sitesi olarak tarayıcan açtığımda
aşağıdaki hatayı alıyorum izinlerle ilgili bi problemim var sanırım fakat Web.Congfig Dosyasına
" <identity impersonate="true" userName="Administrator" password="***"/> " komutunuda ekledim.
Bir Component olarak word u kullandığım için word dosyarı izinlerinide ayarlamam gerekirmi acaba?
Sorun ne olabilir?
HATA:
Word sorunla karşılaştı.
Açıklama: Geçerli web isteği yürütülürken işlenmemiş özel durum oluştu. Lütfen hata ve kod içinde kaynaklandığı yer hakkında daha fazla bilgi almak için yığın izlemesini gözden geçirin. Özel Durum Ayrıntıları: System.Runtime.InteropServices.COMException: Word sorunla karşılaştı. Kaynak Hatası: Satır 324: Satır 325: Object oTemplatePath = Server.MapPath("~/"+belge); Satır 326: oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); Satır 327: Satır 328: foreach (Word.Field myMergeField in oWordDoc.Fields)Kaynak Dosya: C:\Users\Administrator\Desktop\personel\WebApplication4\Default.aspx.cs Satır: 326 Yığın İzleme: [COMException (0x800a13e9): Word sorunla karşılaştı.] Microsoft.Office.Interop.Word.Documents.Add(Object& Template, Object& NewTemplate, Object& DocumentType, Object& Visible) +0 WebApplication4._Default.htmlolustur() in C:\Users\Administrator\Desktop\personel\WebApplication4\Default.aspx.cs:326 WebApplication4._Default.Button1_Click(Object sender, EventArgs e) in C:\Users\Administrator\Desktop\personel\WebApplication4\Default.aspx.cs:40 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3707
-
hocam componet kullanmadan olmazmı diye düşünürken daha önce buna benzer birşey yapmıştım.
public
class
DisariAktar
{
publicvoid Dosya(Literal literal, string fileName, string fileType)
{
string attachment = "attachment; filename=" + fileName + " " + DateTime.Now.ToString() + "." + fileType;HttpContext.Current.Response.ClearContent();HttpContext.Current.Response.Charset = "utf-8";HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1254");HttpContext.Current.Response.AddHeader("content-disposition", attachment);HttpContext.Current.Response.ContentType = "application/" + fileType;//yada ms-exelStringWriter sw = newStringWriter();HtmlTextWriter htw = newHtmlTextWriter(sw);
literal.RenderControl(htw);
if (fileType == "doc")
{
HttpContext.Current.Response.Write(sw.ToString());HttpContext.Current.Response.Flush();HttpContext.Current.Response.End();
}
}
}
kullanırkende
protected void Button1_Click(object sender, EventArgse)
{
DisariAktar aktar = newDisariAktar();
aktar.Dosya(Literal1,
"DosyaAdi", "doc");
}
sen server a kaydetmek istiyorsan ona göre düzeltirsin.
word e yazılmasını istediğin metini literalin textine atayacaksın.
-
Hocam Bu şekilde Word'ün özelliklerini kullanamıyorum yani kenar boşluklarını ayarlıyamıyorum mesela...
NuLL29 bunu yazdı:
-----------------------------hocam componet kullanmadan olmazmı diye düşünürken daha önce buna benzer birşey yapmıştım.
public
class
DisariAktar
{
publicvoid Dosya(Literal literal, string fileName, string fileType)
{
string attachment = "attachment; filename=" + fileName + " " + DateTime.Now.ToString() + "." + fileType;HttpContext.Current.Response.ClearContent();HttpContext.Current.Response.Charset = "utf-8";HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1254");HttpContext.Current.Response.AddHeader("content-disposition", attachment);HttpContext.Current.Response.ContentType = "application/" + fileType;//yada ms-exelStringWriter sw = newStringWriter();HtmlTextWriter htw = newHtmlTextWriter(sw);
literal.RenderControl(htw);
if (fileType == "doc")
{
HttpContext.Current.Response.Write(sw.ToString());HttpContext.Current.Response.Flush();HttpContext.Current.Response.End();
}
}
}
kullanırkende
protected void Button1_Click(object sender, EventArgse)
{
DisariAktar aktar = newDisariAktar();
aktar.Dosya(Literal1,
"DosyaAdi", "doc");
}
sen server a kaydetmek istiyorsan ona göre düzeltirsin.
word e yazılmasını istediğin metini literalin textine atayacaksın.
----------------------------- -
NuLL29 bunu yazdı:
-----------------------------hocam componet kullanmadan olmazmı diye düşünürken daha önce buna benzer birşey yapmıştım.
public
class
DisariAktar
{
publicvoid Dosya(Literal literal, string fileName, string fileType)
{
string attachment = "attachment; filename=" + fileName + " " + DateTime.Now.ToString() + "." + fileType;HttpContext.Current.Response.ClearContent();HttpContext.Current.Response.Charset = "utf-8";HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1254");HttpContext.Current.Response.AddHeader("content-disposition", attachment);HttpContext.Current.Response.ContentType = "application/" + fileType;//yada ms-exelStringWriter sw = newStringWriter();HtmlTextWriter htw = newHtmlTextWriter(sw);
literal.RenderControl(htw);
if (fileType == "doc")
{
HttpContext.Current.Response.Write(sw.ToString());HttpContext.Current.Response.Flush();HttpContext.Current.Response.End();
}
}
}
kullanırkende
protected void Button1_Click(object sender, EventArgse)
{
DisariAktar aktar = newDisariAktar();
aktar.Dosya(Literal1,
"DosyaAdi", "doc");
}
sen server a kaydetmek istiyorsan ona göre düzeltirsin.
word e yazılmasını istediğin metini literalin textine atayacaksın.
-----------------------------hacım bu söylediğinle arkadaşın istediği çok farklı şeyler :D ters mantık yemez yani :)
hocam hazır companent kullanmak zorundasın gibi..
- http://stackoverflow.com/questions/10412/how-can-a-word-document-be-created-in-c
- http://docx.codeplex.com/
-
kardeşim şunu bi net olarak anla: wordün içeriğini filestream ile değiştiremezsin. elindeki bir stringi filestream ile word e yazamassın. word açıldığında hata verir. sen PC'nde bunu ignore edersin bir daha çıkmaz karşına o hata, ama başkaları o dökümanı doğru düzgün kullanamaz. wordun belli standartları var ve bu string yazmak kadar kolay olsaydı, emin ol bu kadar uğraşmazdı kimse.
Interop makinadan makinaya farklılık gösterir, sıkıntı yaratabilir. sen OpenXML'i araştır. OpenXML word 2007 ve sonrasını destekler. C# OpenXML DLL'ini kullanarak en sağlıklı şekilde word üzerinde istediğin herşeyi yapabilirsin.
OpenXML SDK download linki:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5124
Dosya yaratmak için:
http://blog.stuartwhiteford.com/?p=33
http://openxmldeveloper.org/discussions/formats/f/13/p/5218/158267.aspx
MSDN kaynakları:
http://msdn.microsoft.com/en-us/library/dd440953(v=office.12).aspx
http://msdn.microsoft.com/en-us/office/ee441239
http://msdn.microsoft.com/library/bb656295(office.12).aspx
http://msdn.microsoft.com/library/bb739835(office.12).aspx
http://msdn.microsoft.com/library/bb727374(office.12).aspx
Sayfaya özel ayarlar için:
-
DocX.dll diye birşey buldum ve onunla hazır bir word belgesi içinde değişiklik yaptım. Yani taslağı oluşturdum, kendimce değişken yerlere bir kodlama yaptım dosyayı açıp onları replace ettim. Yani dosya içinde <<tckimlik>> yazan yeri çektiğim klimlik numarası ile değiştirdim. Şimdilik işimi gördü..
Blogta kodlarıyla anlatmaya çalıştım belki işinize yarar... Saolun yardımlarınız için...
http://onurkarasoy.blogspot.com/2012/04/aspnet-ile-template-kullanarak-word-doc.html
