none
C sharp projesinde word uygulamaları RRS feed

  • Soru

  • Selam Arkadaşlar.

    Daha önceden bu soruyu sormuştum ama cevap bulamadım bana lütfen yardımcı olurmusunuz.

    Projem bitti bu küçük sorunu hallettikten sonra Projemi teslim edeceğim, küçük hata yüzünden teslim edemiyorum.

    sorunum şu : projemde yazışmalar kısmında Word uygulaması var ve yazışmaları aktar dediğimde worde aktarıyor işlemlerim oluyor, wordü kapattığımda projemi kapatmadan yeniden worde yazışmayı aktar dediğimde hata veriyor ve hata şu şekilde

    'System.Runtime.InteropServices.COMException' türünde bir yakalanamayan özel durum, Aspim1.exe öğesinde oluştu

    Ek bilgi: RPC sunucusu kullanılamıyor. (HRESULT özel durum döndürdü: 0x800706BA)

    bu sorunun ne olduğunu bir türlü anlayamadım

    lütfen uzman bir arkadaş yokmu bu sorun için bana yardım edecek.

    yardım eden arkadaşlardan ALLAH razı olsun...

    saygılar

    12 Kasım 2015 Perşembe 23:15

Yanıtlar

  • Kodunu paylastigin iyi oldu, yoksa hata gorulmeyecekti. public bir word degiskeni kullanma, isi bittigi yerde dispose et, hatanin nedeni o. 

    Ikincisi, object missing gereksiz, cok eskilerde kaldi.

    13 Kasım 2015 Cuma 17:23
    Yanıtlayıcı
  • Bir de, koduna tekrardan bakinca, sen bu isi hic de dogru yapmiyorsun gibi geldi. Koddan net anlasilmasa da MailMerge'i yeniden kesfetmissin gibi. Mailmerge islemi bu sekilde gidip de MergeField formulunu parcala, ne yaziyor al ona gore case ile kur seklinde yapilmaz. Dogrudan bir "tablo" ile "template" merge dokumani kullanilir ve tek harekette sonuc nereye isteniyorsa oraya gonderilir (printer,new document, letter gibi mergeDestination enum var).

    Senin yaptigin sekilde devam etmek istiyorsan, yine de daha kolay yolu document.Fields["ibanno"] gibi indexerlari kullanmak.

     
    13 Kasım 2015 Cuma 17:40
    Yanıtlayıcı
  • Daha once bir Mailmerge ornegi gondermisim:

    void Main()
    {
      // Tab ile ayrilmis veri
      List<OrnekVeri> ornek = new List<OrnekVeri> {
        new OrnekVeri { Ad="Ali", Soyad="Veli", DogumTarihi=new DateTime(1990,1,1), DogumYeri="Izmir", Aciklama="Blah blah"},
        new OrnekVeri { Ad="Ahmet", Soyad="Can", DogumTarihi=new DateTime(1990,2,1), DogumYeri="Istanbul", Aciklama="Blah blah"},
        new OrnekVeri { Ad="Ali", Soyad="Veli", DogumTarihi=new DateTime(1990,3,1), DogumYeri="Ankara", Aciklama="Blah blah"},
      };
      
      StringBuilder sb = new StringBuilder();
      
      sb.AppendLine( "Ad\tSoyad\tDogumTarihi\tDogumYeri\tAciklama" );
      
      foreach (var kayit in ornek)
      {
        sb.AppendFormat("{0}\t{1}\t{2}\t{3}\t{4}\n",
          kayit.Ad,
          kayit.Soyad,
          kayit.DogumTarihi.ToString("dd/MM/yyyy"),
          kayit.DogumYeri,
          kayit.Aciklama);
      }
      Clipboard.SetText(sb.ToString());
      
      // Word ile ilgili kisim
      var word = new Microsoft.Office.Interop.Word.Application();
      var document = word.Documents.Add();
    
      // Hazirlanan veriyi bir word dokumanina yapistir ve tabloya cevir
      document.Content.Paste();
      document.Content.ConvertToTable(WdTableFieldSeparator.wdSeparateByTabs,ornek.Count ()+1,5); // 5 OrnekVeri sutun sayisi
      
      string veriDosyaAdi = Path.ChangeExtension( Path.Combine( Path.GetTempPath(), Path.GetRandomFileName() ), "doc");
      
      document.SaveAs( veriDosyaAdi );
      ((Microsoft.Office.Interop.Word._Document)document).Close(WdSaveOptions.wdSaveChanges);
      
      // Mailmerge dosyasi
      // Bu ornekte bizim hazir sablonumuz yok. Olsaydi onu kullanacaktik
      //var doc = word.Documents.Add( @"c:\MyFolder\Sablon.dot" ); // sablon olsaydi
      
      var doc = word.Documents.Add();
      word.Visible = true;
      
      // sablon olmadigi icin kendi mergefieldlerimizi ekliyoruz
      doc.MailMerge.OpenDataSource( veriDosyaAdi); // yukarida sakladigimiz dokuman data source
      doc.MailMerge.EditMainDocument(); // merge dokumanini edit moda aldik
      
      // fakir adamin kodla mailmerge sablonu
      doc.Application.Selection.TypeText("Sevgili ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "Ad");
      doc.Application.Selection.TypeText(" ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "Soyad");
      doc.Application.Selection.TypeText(",\nKayitlarimiza gore:\nDogum Tarihiniz: ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "DogumTarihi");
      doc.Application.Selection.TypeText("\nDogum Yeriniz: ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "DogumYeri");
      doc.Application.Selection.TypeText("\nAciklamalar:\n");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "Aciklama");
      doc.Application.Selection.TypeText(String.Format("\n\nTesekkurler. {0}", DateTime.Today.ToLongDateString()));
      // sablon bitti
      
      // sablonla veriyi birlestirip her kaydi yeni bir dokumana yaziyoruz (mail merge)
      doc.MailMerge.Destination= WdMailMergeDestination.wdSendToNewDocument;
      doc.MailMerge.Execute();
      
      
    }
    
    public class OrnekVeri
    {
      public string Ad { get; set; }
      public string Soyad { get; set; }
      public DateTime DogumTarihi { get; set; }
      public string DogumYeri { get; set; }
      public string Aciklama { get; set; }
    }

    13 Kasım 2015 Cuma 17:42
    Yanıtlayıcı

Tüm Yanıtlar

  • Selam Arkadaşlar.

    Daha önceden bu soruyu sormuştum ama cevap bulamadım bana lütfen yardımcı olurmusunuz.

    Projem bitti bu küçük sorunu hallettikten sonra Projemi teslim edeceğim, küçük hata yüzünden teslim edemiyorum.

    sorunum şu : projemde yazışmalar kısmında Word uygulaması var ve yazışmaları aktar dediğimde worde aktarıyor işlemlerim oluyor, wordü kapattığımda projemi kapatmadan yeniden worde yazışmayı aktar dediğimde hata veriyor ve hata şu şekilde

    'System.Runtime.InteropServices.COMException' türünde bir yakalanamayan özel durum, Aspim1.exe öğesinde oluştu

    Ek bilgi: RPC sunucusu kullanılamıyor. (HRESULT özel durum döndürdü: 0x800706BA)

    bu sorunun ne olduğunu bir türlü anlayamadım

    lütfen uzman bir arkadaş yokmu bu sorun için bana yardım edecek.

    yardım eden arkadaşlardan ALLAH razı olsun...

    saygılar


    kullandığın kod bloğunu yazarmısın.
    13 Kasım 2015 Cuma 00:33
  • tabiki

    13 Kasım 2015 Cuma 17:03
  • using Word = Microsoft.Office.Interop.Word;

    Word.Application uygulama = new Word.Application();
    Word.Document belge;

       private void button17_Click(object sender, EventArgs e)
            {
                uygulama.Visible = true;
                //Oluşturduğumuz word dosyasının kullanıcı tarafından görülmesini istiyoruz.
                object missing = Missing.Value;
                Object sablonYolu = System.Windows.Forms.Application.StartupPath + "\\kesilengelirdurumuasimi.doc";
                belge = uygulama.Documents.Add(ref sablonYolu, ref missing, ref missing, ref missing);
                foreach (Word.Field alanAdi in belge.Fields)
                {
                    toplamAlan++;
                    Word.Range rngAlan = alanAdi.Code;
                    string fieldText = rngAlan.Text;

                    if (fieldText.StartsWith(" MERGEFIELD"))
                    {
                        int bitis = fieldText.IndexOf("\\");
                        int uzunluk = fieldText.Length - bitis;
                        string fieldName = fieldText.Substring(11, bitis - 11);
                        fieldName = fieldName.Trim();

                        switch (fieldName)
                        {
                            case "engelliadisoyadi": alanYaz(alanAdi, textBox100.Text); break;
                            case "engellitcno": alanYaz(alanAdi, textBox99.Text); break;
                            case "bakiciadisoyadi": alanYaz(alanAdi, textBox98.Text); break;
                            case "bakicitcno": alanYaz(alanAdi, textBox97.Text); break;
                            case "bankaadisubesi": alanYaz(alanAdi, textBox96.Text); break;
                            case "hesapno": alanYaz(alanAdi, textBox95.Text); break;
                            case "ibanno": alanYaz(alanAdi, textBox94.Text); break;
                            case "kesilmetarihi": alanYaz(alanAdi, maskedTextBox31.Text); break;
                            default: break;

                        }
                    }
                }
                yazismatemizle();
                bag.Close();
            }

    privatevoidalanYaz(Word.Fieldalan, stringtext)

            {

                alan.Select();

                uygulama.Selection.TypeText(text);

               

            }

    13 Kasım 2015 Cuma 17:07
  • Kodunu paylastigin iyi oldu, yoksa hata gorulmeyecekti. public bir word degiskeni kullanma, isi bittigi yerde dispose et, hatanin nedeni o. 

    Ikincisi, object missing gereksiz, cok eskilerde kaldi.

    13 Kasım 2015 Cuma 17:23
    Yanıtlayıcı
  • Bir de, koduna tekrardan bakinca, sen bu isi hic de dogru yapmiyorsun gibi geldi. Koddan net anlasilmasa da MailMerge'i yeniden kesfetmissin gibi. Mailmerge islemi bu sekilde gidip de MergeField formulunu parcala, ne yaziyor al ona gore case ile kur seklinde yapilmaz. Dogrudan bir "tablo" ile "template" merge dokumani kullanilir ve tek harekette sonuc nereye isteniyorsa oraya gonderilir (printer,new document, letter gibi mergeDestination enum var).

    Senin yaptigin sekilde devam etmek istiyorsan, yine de daha kolay yolu document.Fields["ibanno"] gibi indexerlari kullanmak.

     
    13 Kasım 2015 Cuma 17:40
    Yanıtlayıcı
  • Daha once bir Mailmerge ornegi gondermisim:

    void Main()
    {
      // Tab ile ayrilmis veri
      List<OrnekVeri> ornek = new List<OrnekVeri> {
        new OrnekVeri { Ad="Ali", Soyad="Veli", DogumTarihi=new DateTime(1990,1,1), DogumYeri="Izmir", Aciklama="Blah blah"},
        new OrnekVeri { Ad="Ahmet", Soyad="Can", DogumTarihi=new DateTime(1990,2,1), DogumYeri="Istanbul", Aciklama="Blah blah"},
        new OrnekVeri { Ad="Ali", Soyad="Veli", DogumTarihi=new DateTime(1990,3,1), DogumYeri="Ankara", Aciklama="Blah blah"},
      };
      
      StringBuilder sb = new StringBuilder();
      
      sb.AppendLine( "Ad\tSoyad\tDogumTarihi\tDogumYeri\tAciklama" );
      
      foreach (var kayit in ornek)
      {
        sb.AppendFormat("{0}\t{1}\t{2}\t{3}\t{4}\n",
          kayit.Ad,
          kayit.Soyad,
          kayit.DogumTarihi.ToString("dd/MM/yyyy"),
          kayit.DogumYeri,
          kayit.Aciklama);
      }
      Clipboard.SetText(sb.ToString());
      
      // Word ile ilgili kisim
      var word = new Microsoft.Office.Interop.Word.Application();
      var document = word.Documents.Add();
    
      // Hazirlanan veriyi bir word dokumanina yapistir ve tabloya cevir
      document.Content.Paste();
      document.Content.ConvertToTable(WdTableFieldSeparator.wdSeparateByTabs,ornek.Count ()+1,5); // 5 OrnekVeri sutun sayisi
      
      string veriDosyaAdi = Path.ChangeExtension( Path.Combine( Path.GetTempPath(), Path.GetRandomFileName() ), "doc");
      
      document.SaveAs( veriDosyaAdi );
      ((Microsoft.Office.Interop.Word._Document)document).Close(WdSaveOptions.wdSaveChanges);
      
      // Mailmerge dosyasi
      // Bu ornekte bizim hazir sablonumuz yok. Olsaydi onu kullanacaktik
      //var doc = word.Documents.Add( @"c:\MyFolder\Sablon.dot" ); // sablon olsaydi
      
      var doc = word.Documents.Add();
      word.Visible = true;
      
      // sablon olmadigi icin kendi mergefieldlerimizi ekliyoruz
      doc.MailMerge.OpenDataSource( veriDosyaAdi); // yukarida sakladigimiz dokuman data source
      doc.MailMerge.EditMainDocument(); // merge dokumanini edit moda aldik
      
      // fakir adamin kodla mailmerge sablonu
      doc.Application.Selection.TypeText("Sevgili ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "Ad");
      doc.Application.Selection.TypeText(" ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "Soyad");
      doc.Application.Selection.TypeText(",\nKayitlarimiza gore:\nDogum Tarihiniz: ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "DogumTarihi");
      doc.Application.Selection.TypeText("\nDogum Yeriniz: ");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "DogumYeri");
      doc.Application.Selection.TypeText("\nAciklamalar:\n");
      doc.MailMerge.Fields.Add( doc.Application.Selection.Range, "Aciklama");
      doc.Application.Selection.TypeText(String.Format("\n\nTesekkurler. {0}", DateTime.Today.ToLongDateString()));
      // sablon bitti
      
      // sablonla veriyi birlestirip her kaydi yeni bir dokumana yaziyoruz (mail merge)
      doc.MailMerge.Destination= WdMailMergeDestination.wdSendToNewDocument;
      doc.MailMerge.Execute();
      
      
    }
    
    public class OrnekVeri
    {
      public string Ad { get; set; }
      public string Soyad { get; set; }
      public DateTime DogumTarihi { get; set; }
      public string DogumYeri { get; set; }
      public string Aciklama { get; set; }
    }

    13 Kasım 2015 Cuma 17:42
    Yanıtlayıcı
  • çetin abi disposeyi nasıl yapacam örnek verebilirmisin

    dediğğin gibi object misingi sildim

    saygılar

    13 Kasım 2015 Cuma 18:49
  • abi bu işte yeterince iyi değilim farkındayım bu kodları nasıl düzenlerim tam olarak

    13 Kasım 2015 Cuma 18:54
  • Merhaba,

    uygulama.Quit();

    Daha önce açmış olduğunuz konuda size cevap verdiğimizi düşünüyorum. Siz konu devamında Devexpress kullanarak nasıl yapabileceğinizi sordunuz. Ben de size cevap verdim. Kusura bakmayın bir lokantaya gidip yemek sipariş etmiyorsunuz Mutfağa girip sizin yapmanız gerekir. Ancak buradaki ustalar hangi malzemeyi nasıl kullanacağınızı söyleyebilir. Aksi durumda kendinizi geliştiremezsiniz. Ayrıca internetten kopyala yapıştır yöntemi ile bir noktaya kadar gidebilirsiniz. Bence uygulama geliştirmeden önce bazı konuları aradan çıkartmanız gerekir.

    Öğrenerek yapmanızda fayda var.

    İyi günler.

    14 Kasım 2015 Cumartesi 08:58