c# - solo - unir word online gratis
¿Cómo se combina un documento de Word en c#? (2)
Lo que intento lograr
En mi aplicación c # me gustaría generar un informe (documento de Word) a partir de los datos en mi aplicación, pensé que la mejor manera de hacerlo sería realizar algo así como una combinación de correspondencia usando la fuente de datos de mi aplicación.
Lo que he intentado
- Intenté seguir este Mail Merge en una palabra, sin embargo, esto usa GemBox, que debes pagar
He intentado usar Microsoft.Office.Interop.Word, pero me quedé corto cuando no sabía cómo hacer referencia al documento de la plantilla guardada:
Dictionary<string, string> MailMerge = new Dictionary<string, string>() { { "ID", "123" }, { "Name", "Test" }, { "Address1", "Test" }, { "Address2", "Test" }, { "Address3", "Test" }, { "Address4", "Test" }, { "PostCode", "Test" }, { "Year End", "Test" }, { "SicCode", "123" }, }; Document doc = new Document(); doc.MailMerge.Execute(MailMerge);
Resumen
Estoy buscando orientación sobre qué investigar más, ya que creo que debe haber una forma "estándar" de hacerlo.
Esto es bastante simple al usar Microsoft.Office.Interop.Word
. Aquí hay un sencillo tutorial paso a paso sobre cómo hacer esto.
El código para reemplazar un mergefield con una cadena es así:
public static void TextToWord(string pWordDoc, string pMergeField, string pValue)
{
Object oMissing = System.Reflection.Missing.Value;
Object oTrue = true;
Object oFalse = false;
Word.Application oWord = new Word.Application();
Word.Document oWordDoc = new Word.Document();
oWord.Visible = true;
Object oTemplatePath = pWordDoc;
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
foreach (Word.Field myMergeField in oWordDoc.Fields)
{
Word.Range rngFieldCode = myMergeField.Code;
String fieldText = rngFieldCode.Text;
if (fieldText.StartsWith(" MERGEFIELD"))
{
Int32 endMerge = fieldText.IndexOf("//");
Int32 fieldNameLength = fieldText.Length - endMerge;
String fieldName = fieldText.Substring(11, endMerge - 11);
fieldName = fieldName.Trim();
if (fieldName == pMergeField)
{
myMergeField.Select();
oWord.Selection.TypeText(pValue);
}
}
}
}
originalmente publicado aquí y aquí
En caso de que desee utilizar un diccionario para reemplazar muchos campos a la vez, use el siguiente código:
public static void TextToWord(string pWordDoc, Dictionary<string, string> pDictionaryMerge)
{
Object oMissing = System.Reflection.Missing.Value;
Object oTrue = true;
Object oFalse = false;
Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document();
oWord.Visible = true;
Object oTemplatePath = pWordDoc;
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
foreach (Microsoft.Office.Interop.Word.Field myMergeField in oWordDoc.Fields)
{
Microsoft.Office.Interop.Word.Range rngFieldCode = myMergeField.Code;
String fieldText = rngFieldCode.Text;
if (fieldText.StartsWith(" MERGEFIELD"))
{
Int32 endMerge = fieldText.IndexOf("//");
Int32 fieldNameLength = fieldText.Length - endMerge;
String fieldName = fieldText.Substring(11, endMerge - 11);
fieldName = fieldName.Trim();
foreach (var item in pDictionaryMerge)
{
if (fieldName == item.Key)
{
myMergeField.Select();
oWord.Selection.TypeText(item.Value);
}
}
}
}
}
También estoy usando lo mismo, pero tengo más complejidad. Debo verificar también la condición if. En el archivo de plantilla de palabra {IF «Entrega» = Mensual ", aparecerá la tabla" "Nada que mostrar"}
cuando uso el código anterior compartido en la respuesta. y para si la condición en c # he escrito
Range rngFieldCode = myMergeField.Code;
String fieldText = rngFieldCode.Text.Trim();
if (fieldText.ToUpper().StartsWith("IF"))
{
myMergeField.UpdateSource();}
entonces la salida es como
{IF Monthly = Monthly ", aparecerá la tabla" "Nothing to show"}
pero el resultado deseado es solo "entonces la tabla aparecerá".