internet pencereler Android

Kullanıcı verilerinden bir şablon belgesi oluşturma. Word'de programlı form belgeleri oluşturma

"Otomatik Belge Doldurma" serisinin önceki yazılarında VBA kodu kullanmadan bir uygulamanın kullanıcı arayüzünün nasıl oluşturulacağından, girdi doğrulamasının nasıl organize edileceğinden ve kelimelerle bir sayının nasıl alınacağından bahsetmiştim. Bu son makalede, sihir hakkında konuşacağız - gerekli tüm değerleri bir Excel çalışma kitabından bir Word belgesine aktarmak. Size nihai sonucu göstereyim:

Mekanizmanın açıklaması

Başlangıç ​​olarak, verilerin bir Word belgesine nasıl aktarılacağını genel hatlarıyla anlatacağım. Her şeyden önce, tüm işaretlemeleri, tabloları ve metnin değişmeden kalacak bölümünü içeren bir Word belgesi şablonuna ihtiyacımız var. Bu şablonda, Excel çalışma kitabından alınan değerlerin değiştirileceği yerleri tanımlamanız gerekir - bunu yapmanın en uygun yolu yer imlerinin yardımıyla. Bundan sonra, Excel verilerini Word şablonuyla eşleşecek şekilde düzenlemeniz ve son olarak, ancak en az değil, aktarım prosedürünün kendisini VBA'da yazmanız gerekir.

Yani, önce ilk şeyler.

Bir Word Belgesi Şablonu Oluşturun

Burada her şey son derece basit - normal bir belge oluşturuyoruz, metni yazıp biçimlendiriyoruz, genel olarak gerekli formu elde etmek için elde ediyoruz. Excel'den değerleri değiştirmenin gerekli olacağı yerlerde, yer imleri oluşturmanız gerekir. Bu, aşağıdaki şekilde yapılır:

Bu nedenle, tüm yer imlerini oluşturmanız, yani Excel'den verilerin ekleneceği tüm yerleri işaretlemeniz gerekecektir. Ortaya çıkan dosya, "Dosya" -> "Farklı Kaydet..." menü öğesi kullanılarak bir "MS Word Şablonu" olarak kaydedilmelidir.

Excel veri hazırlama

Kolaylık sağlamak için, Word belgesine aktarılması gereken tüm verileri Yer İmleri - yer imleri adlı ayrı bir çalışma sayfasına koymaya karar verdim. Bu sayfanın iki sütunu vardır: ilki yer imlerinin adlarını içerir (tam olarak Word belgesinde adlandırıldıkları gibi) ve ikincisi aktarılacak ilgili değerleri içerir.

Bu değerlerin bir kısmı doğrudan veri giriş sayfasından, bir kısmı ise Destek sayfasında yer alan yardımcı tablolardan elde edilmektedir. Bu yazımda istenilen değerleri hesaplayan formülleri analiz etmeyeceğim, net olmayan bir şey varsa yorumlarda soru sorun.

Bu aşamada, yer imlerinin tüm adlarını doğru bir şekilde belirtmek önemlidir - veri aktarımının doğruluğu buna bağlıdır.

Transfer prosedürü

Ama bu en ilginç olanı. Veri taşıma kodunu yürütmek için iki seçenek vardır:

  • Kod bir Excel çalışma kitabında yürütülür, veriler Word'e her seferinde bir değer iletilir ve hemen belgeye yerleştirilir.
  • Kod ayrı bir Word belgesinde yürütülür, tüm veriler Excel'den tek bir toplu iş halinde aktarılır.

Yürütme hızı açısından, özellikle çok sayıda yer imiyle, ikinci seçenek çok daha çekici görünüyor, ancak daha karmaşık eylemler gerektiriyor. Benim kullandığım buydu.

İşte yapılması gerekenler:

  • Makro etkinleştirilmiş bir Word belge şablonu oluşturun. Bu şablon yürütülebilir VBA kodunu içerecektir.
  • Oluşturulan şablonda VBA ile yazılmış bir program yerleştirmeniz gerekiyor. Bunun için bir şablon düzenlerken Alt + F11 tuş kombinasyonuna basın ve açılan Visual Basic düzenleyici penceresinde program kodunu girin.
  • Bir Excel çalışma kitabında, yeni oluşturulan Word şablonundan doldurma prosedürünü çağıran kod yazın.

Makalede prosedürün metnini vermeyeceğim - örnek arşivdeki Template klasöründe bulunan FillDocument.dotm dosyasında kolayca görüntülenebilir.

Tüm bunları kendi özel probleminizi çözmek için nasıl kullanabilirsiniz?

Kelimelerde her şeyin çok basit göründüğünü anlıyorum, ama pratikte ne oluyor? Sadece hazır seçeneği kullanmanızı öneririm. Örnekle arşivi indirin, bir Excel çalışma kitabında, Visual Basic düzenleyicisini açmak ve program hakkındaki tüm yorumlarımı okumak için Alt + F11 tuş bileşimine basın. Programı ihtiyaçlarınıza göre değiştirmek için sadece birkaç sabitin değerini değiştirmeniz yeterlidir, bunlar programın en başına yerleştirilir. Programın tüm metnini projenize özgürce kopyalayabilirsiniz.

Arşiv yapısı

Bu makaleye eklenen arşiv birkaç dosya içermektedir.

Ana dosya, "Onay Oluştur" adlı bir Excel çalışma kitabıdır. Bu çalışma kitabında sadece ikisi görüntülenen 4 çalışma sayfası vardır: "Giriş" - bir veri giriş sayfası ve "Veritabanı" - girilen tüm belgelerin bir arşivi.

Şablonlar klasörü, Word belge şablonlarını içerir. Bunlardan biri yer imi doldurma programı içeren bir şablon, ikincisi ise doldurulması gereken bir form. Şablonu programla birlikte değişiklik yapmadan kullanabilirsiniz, ancak doldurulacak formun elbette ihtiyaçlarınıza göre değiştirilmesi gerekecektir.

"Kendiniz için" örneği nasıl yeniden işleyebilirsiniz?

  1. Tamamlanacak bir Word belge şablonu hazırlayın. İçinde gerekli tüm yer imlerini oluşturun ve bir "MS Word şablonu" olarak kaydedin.
  2. Bu yazının ekindeki arşivden FillDocument.dotm dosyasını hazırlanan şablonun bulunduğu klasöre kopyalayın. Bu dosya, şablon yer imlerinin doldurulmasından sorumludur ve içinde hiçbir şeyin değiştirilmesi gerekmez.
  3. Veri girişi için bir Excel çalışma kitabı hazırlayın. Herhangi bir "gelişmiş" kullanıcı arayüzüne sahip olup olmayacağına karar vermek ve çeşitli zor hesaplamalar yapmak size kalmış. Ana şey, Word şablonundaki yer iminin adı ile değiştirilecek değer arasında bir yazışma tablosu içeren bir çalışma sayfası içermesidir.
  4. Örnek dosyadan VBA program kodunu hazırlanan çalışma kitabına ekleyin. Tüm sabitleri projenize göre değiştirin.
  5. Doğru çalışma için test edin.
  6. Aktif olarak tadını çıkarın!

Daha önce başladığımız Word'de formlarla çalışma temasına devam ediyoruz. Önceki makalelerde, formlara yalnızca “yetkili kullanıcı” perspektifinden baktık, yani. manuel doldurmaya uygun belgeler oluşturduk. Bugün, bu görevi genişletmeyi ve belgeler oluşturmak için İçerik kontrol mekanizmasını kullanmayı denemeyi önermek istiyorum.

Acil görevimize geçmeden önce, içerik kontrol verilerinin Word belgelerinde nasıl saklandığı hakkında birkaç söz söylemek istiyorum (şimdilik bunların belgenin içeriğine nasıl bağlandıklarını kasıtlı olarak atlayacağım, ancak geri dönmeyi umuyorum). Buna sonraki makalelerde bazen).

meşru soru nedir itemProps1.xml ve benzeri bileşenler? Bu bileşenler, veri kaynaklarının açıklamalarını saklar. Büyük olasılıkla, geliştiriciler tarafından tasarlandığı gibi, belgeye gömülü xml dosyalarına ek olarak, başkalarını kullanması gerekiyordu, ancak şimdiye kadar sadece bu yöntem uygulandı.

bize ne faydası var itemPropsX.xml? xml şemalarını listelemeleri (onların hedefAd alanı) ebeveynde kullanılan itemX.xml. Bu, belgeye birden fazla özel xml eklediysek, o zaman doğru olanı bulmak için, içinden geçmemiz gerektiği anlamına gelir. itemPropsX.xml bileşenleri ve istenen devreyi ve dolayısıyla istenen devreyi bulun itemX.xml.

Şimdi bir an daha. Bileşenler arasındaki ilişkileri manuel olarak analiz etmeyeceğiz ve yalnızca temel Packaging API'yi kullanarak doğru olanları aramayacağız! Bunun yerine, Açık XML SDK'sını kullanacağız (yapıları NuGet aracılığıyla edinilebilir). Tabii ki, bu API hakkında daha önce tek kelime etmedik, ancak görevimiz için minimum gerektirir ve tüm kodlar oldukça şeffaf olacaktır.

Eh, ana giriş yapıldı, örneğe geçebilirsiniz.

Yerleşik geleneğe göre, makalede çizdiğimiz aynı “Toplantı Raporunu” alacağız. Belge şablonunun nasıl göründüğünü size hatırlatmama izin verin:

Ve böylece, belge alanlarının bağlı olduğu XML

< meetingNotes xmlns ="urn:MeetingNotes" subject ="" date ="" secretary ="" > < participants > < participant name ="" /> < decisions > < decision problem ="" solution ="" responsible ="" controlDate ="" />

Adım 1. Bir veri modeli oluşturun

Aslında görevimiz sadece bir belge oluşturmak değil, hem geliştirici hem de kullanıcı tarafından kullanılacak uygun bir araç (en azından taslak sürümde) oluşturmaktır.

Bu nedenle, modeli C# sınıflarının bir yapısı olarak ilan edeceğiz:

Genel sınıf MeetingNotes ( public MeetingNotes() ( Katılımcılar = yeni Liste (); Kararlar = yeni Liste (); ) public string Konu ( get; set; ) public DateTime Date ( get; set; ) public string Sekreter ( get; set; ) genel Liste Katılımcılar ( get; set; ) genel Liste Kararlar ( get; set; ) ) public class Decision ( public string Problem ( get; set; ) public string Çözüm ( get; set; ) public string Sorumlu ( get; set; ) public DateTime ControlDate ( get; set; ) ) public class Katılımcı ( public string Name ( get; set; ) )

Genel olarak, XML serileştirmesini kontrol etmek için özniteliklerin eklenmesi dışında özel bir şey yoktur (çünkü modeldeki adlar ve gerekli XML biraz farklıdır).

Adım 2: Yukarıdaki modeli XML'e seri hale getirin

Görev, prensipte önemsizdir. Biri için değilse, "en sevdiğimiz XmlSerializer'ımızı alın ve gidin" denilen şey Ancak

Ne yazık ki, Office'in şu anki sürümünde, görünüşe göre, aşağıdaki gibi bir hata var: if özel xml'de ön ana ad alanını (Word'ün görüntülemek için öğeleri alması gereken), biraz daha bildirin, ardından tekrarlanan İçerik kontrolleri yanlış görüntülenmeye başlar (yalnızca şablonun kendisinde olduğu kadar çok öğe gösterilir - yani yinelenen bölüm iş).

Şunlar. İşte çalışan xml:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

ve bu da:

< test xmlns ="urn:Test" attr1 ="1" attr2 ="2" xmlns:t ="urn:TTT" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

ve bu gitti:

< test xmlns:t ="urn:TTT" xmlns ="urn:Test" attr1 ="1" attr2 ="2" > < repeatedTag attr ="1" /> < repeatedTag attr ="2" /> < repeatedTag attr ="3" />

Connect'te Microsoft desteğine bir hata göndermeye çalıştım, ancak bir nedenden dolayı Office aracılığıyla hata gönderme erişimim reddedildi. MSDN forumunda bir tartışma da yardımcı olmadı.

Genel olarak, gerekli dolambaçlı manevra. XML'i elle oluştursaydık hiçbir sorun olmazdı - her şeyi kendimiz yapardık. Ancak, bu durumda, bu ad alanları kullanılmasa bile, varsayılan olarak birkaç ad alanını çıktı XML'sine ekleyen standart XmlSerializer'ı gerçekten kullanmak istiyorum.

XmlSerializer'da kendi ad alanlarımızın çıktısını tamamen bastıracağız. Doğru, bu yaklaşım yalnızca gerçekten onlara ihtiyacı olmadığında işe yarayacaktır (aksi takdirde yine de eklenecektir ve bizimkilerden ÖNCE).

Aslında, kodun tamamı (değişkenin buluşma notları MeetingNotes türünde önceden doldurulmuş bir nesne içerir):

var serializer = new XmlSerializer(typeof (MeetingNotes));
var serializedDataStream = new MemoryStream();

var namespaces = new XmlSerializerNamespaces();
namespaces.Add(“” , “” );

serializer.Serialize(serializedDataStream, MeetingNotes, ad alanları);
serializedDataStream.Seek(0, SeekOrigin.Begin);

Adım 3. Ortaya çıkan XML'i bir Word belgesine giriyoruz.

Burada şunları yapıyoruz:

  • şablonu kopyalayın ve kopyayı açın
  • içinde istediğiniz özel xml'yi bulun (ad alanına göre arayın “urn:Toplantı Notları”)
  • bileşenin içeriğini XML'imizle değiştiriyoruz

File.Copy(şablonAdı, sonuçDocumentName, true ); kullanarak (var document = WordprocessingDocument.Open(resultDocumentName, true )) ( var xmlpart = document.MainDocumentPart.CustomXmlParts .Single(xmlPart => xmlPart.CustomXmlPropertiesPart.DataStoreItem.SchemaReferences.OfType) () .Any(sr => sr.Uri.Value == "(!LANG:urn:MeetingNotes)"!}

Hepimiz öyle ya da böyle metinlerle uğraşıyoruz. Bazen, örneğin biçimlendirme ile oynamak gibi bazı görevler için çok büyük veya çok büyük olmayan miktarda metin oluşturmaya ihtiyaç duyulur, ancak elde metin yoktur, kendiniz yazmak için çok tembeldir. Ne yapalım? Cevap basit: Word'de yerleşik rastgele metin oluşturucuyu kullanın!

Microsoft Word düzenleyicide, özel komutları kullanarak hızlı ve kolay bir şekilde metin oluşturabilirsiniz. Word 2007'yi kobay olarak kullanacağım.Bu komutlar Word'ün tüm sürümlerinde çalışmalıdır. Size metin oluşturmanın üç yöntemini anlatacağım.

Yöntem 1: Rand() kullanma

Rand() işlevi, yerelleştirilmiş bir metin örneği, 3 cümleden oluşan 3 paragraf ekler. Word'ünüzü açın, imlecinizi metnin yakında görüneceği yere getirin ve şu komutu girin:

ve Enter'a basın. Rand işlevinin kendisi kaybolacak ve bunun yerine 3 paragraf metin görünecektir:

Ama hepsi bu değil. Çok fazla metne ihtiyacınız varsa, Rand işlevini aşağıdaki gibi ek argümanlarla kullanabilirsiniz:

=rand(x,y)

nerede " x' paragraf sayısı anlamına gelir ve ' y» her paragraftaki cümle sayısıdır. Örneğin, =rand(20.5) her biri beş cümleden oluşan 20 paragraf ekleyecektir. A =rand(7) her biri 3 cümleden oluşan 7 paragraf ekleyecektir.

Yöntem 2: lorem() kullanma

Eski güzel Lorem Ipsum'u örnek olarak eklemek için - lorem () işlevini kullanın. Aşağıdaki komutu yazın ve Enter'a basın:

Ve bu tamamen Latince metni alıyoruz

lorem() işlevi, birkaç paragraf ve cümle biçimindeki Rand() gibi ek argümanları da kolayca kabul eder. Argüman olmadan, işlev varsayılan olarak her biri 3 cümleden oluşan 3 paragraf ekler.

Yöntem 3. Rand.old() işlevi

Kullanım önceki komutlara benzer:

=rand.eski()

ve Enter'a basın.

Rand.old() işlevi, 2003'e kadar ve dahil olmak üzere eski ofisle uyumluluk için bırakılmıştır. Uygulama yöntemi önceki ikisiyle aynıdır, sadece metin aynı ifadelerden oluşacaktır "Bu yumuşak Fransız rulolarından daha fazla ye ve çay iç." Bu ifade, bazen yazı tipleriyle çalışmak zorunda kalan herkes tarafından bilinir.

Argümanları ilk iki yöntemde olduğu gibi iletebilirsiniz.

Hepsi bu, metinler oluşturuldu, şimdi bu yumuşak Fransız rulolarından daha fazla yiyebilir ve çay içebilirsiniz :)

Yukarıdaki işlevleri kullanarak metin ekleyebildiniz mi?