Избегайте переноса строк в объединенных документах

У меня есть эта программа, которую я написал для создания этикеток для складских помещений моей компании. Каждый сезон мы печатаем несколько сотен этикеток.

У меня проблема в том, что при размере шрифта, используемом в шаблоне, иногда переносы строк, а затем вещи труднее читать или не помещаются на ярлыках и т. Д. Поэтому я в конечном итоге просматриваю полученный документ слияния, и вручную уменьшая размеры шрифта отдельных строк, где происходит перенос строк. Это настоящая боль в заднице.

Что я действительно хочу сделать, так это для содержимого данного поля установить максимальный размер шрифта, равный или меньший, чем размер шрифта, используемый в шаблоне, что предотвращает перенос строк. Но мне трудно понять, как этого добиться.

Это не может быть необычной проблемой? Конечно, есть какое-то очевидное решение, которое я пропускаю?

Если ничего другого, я думаю, что я, вероятно, могу использовать словарь, который отображает длины строк в размерах шрифтов, которые я просто придумал методом проб и ошибок. Но, похоже, должен быть какой-то лучший способ, который не бросился бы в меня, чтобы кто-то с большим опытом взаимодействия с Word мог бы указать мне.

Вот мой код:

    /// <summary>
    /// Creates a mail merge document from a template and some data.
    /// </summary>
    /// <param name="templatePath">
    ///   The path (including the pathname) of the template file to open.
    /// </param>
    /// <param name="mergedFilePath">
    ///   The path (including the pathname) to save the resulting merged file to
    /// </param>
    /// <param name="mergeData">
    ///   The data to use for the merge - An array of Dictionaries that map strings to strings; 
    ///   the keys are template field names and the values are the field values to use.
    /// </param>
    public void Create(string templatePath, string mergedFilePath, DataTable mergeData){
        Object oMissing = System.Reflection.Missing.Value;

        // start up word and start reporting progress
        Word.Application wordApp = new Word.Application();
        ProgressStarted("Creating merge document..", mergeData.Rows.Count);  

        Thread thread = new Thread(() => {

            try {
                // copy the template file to the target file (for the sake of the layout properties)
                if (File.Exists(mergedFilePath)) {
                    File.Delete(mergedFilePath);
                }
                File.Copy(templatePath, mergedFilePath);

                // open the template, the target document, and a (new) temporary document (that will never be saved)
                Word.Document templateDoc = wordApp.Documents.Add(templatePath, oMissing, oMissing, oMissing);
                Word.Document mergedDoc = wordApp.Documents.Add(mergedFilePath, oMissing, oMissing, oMissing);
                Word.Document tempDoc = wordApp.Documents.Add(oMissing, oMissing, oMissing, oMissing);

                // clear out the target document (to start with)
                mergedDoc.Activate();
                mergedDoc.Content.Text = "";

                // iterate through the rows in mergeData
                int rowNum = 0;
                while (rowNum < mergeData.Rows.Count) {

                    // copy the template document into the temporary document
                    tempDoc.Content.FormattedText = templateDoc.Content.FormattedText;

                    // replace the text in the merge fields in the temporary document
                    foreach (Word.Field mergeField in tempDoc.Fields) {

                        // the field text comes in the format " MERGEFIELD  {fieldname} " (without the quotes or curly braces)
                        Word.Range rngFieldCode = mergeField.Code;
                        String[] fieldText = rngFieldCode.Text.Trim().Split((char[])null, StringSplitOptions.RemoveEmptyEntries); // null parameter means "use whitespace as a delimiter"
                        if (rowNum < mergeData.Rows.Count) {
                            if (fieldText[0] == "MERGEFIELD") {
                                string fieldName = fieldText[1];
                                string fieldValue = mergeData.Rows[rowNum][fieldName].ToString();

                                System.Diagnostics.Debug.WriteLine(string.Format("field: {0}  value: {1}", fieldName, fieldValue));

                                mergeField.Select();
                                wordApp.Selection.TypeText(fieldValue);     // type the value into the field
                            }
                            else if (fieldText[0] == "NEXT") {
                                rowNum += 1;
                                ProgressMade(rowNum);           // (invoked progress display update)
                                mergeField.Code.Text = "";      // blank out where it says "<<next record>>"
                            }
                        }
                        else {
                            mergeField.Code.Text = "";          // blank out the remaining fields after we run out of data
                        }
                    }

                    // add the contents of the temporary document into the target document
                    mergedDoc.Content.Select();
                    wordApp.Selection.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
                    wordApp.Selection.InsertXML(tempDoc.Content.XML);
                    tempDoc.Content.Text = "";

                    // if we're not done yet, insert a page break
                    if (rowNum < mergeData.Rows.Count) {
                        mergedDoc.Content.Select();
                        wordApp.Selection.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
                        wordApp.Selection.InsertBreak();
                        wordApp.Selection.InsertXML(tempDoc.Content.XML);
                    }
                }

                // delete the last empty paragraph (hopefully this will eliminate any dangling empty page)
                Word.Paragraph emptyPara = null;
                foreach (Word.Paragraph para in mergedDoc.Paragraphs) {
                    if (para.Range.Text.Trim() == String.Empty) {
                        emptyPara = para;
                    }
                }
                if (emptyPara != null) {
                    emptyPara.Range.Select();
                    wordApp.Selection.Delete();
                }

                // save the merged document
                mergedDoc.SaveAs(mergedFilePath);

                //mergedApp.Documents.Open(mergedFilePath);

                // close and release the documents
                ((Word._Document)tempDoc).Close(Word.WdSaveOptions.wdDoNotSaveChanges);
                ((Word._Document)mergedDoc).Close(Word.WdSaveOptions.wdDoNotSaveChanges);
                ((Word._Document)templateDoc).Close(Word.WdSaveOptions.wdDoNotSaveChanges);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(tempDoc);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(mergedDoc);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(templateDoc);
                tempDoc = null;
                mergedDoc = null;
                templateDoc = null;
            }
            catch (Exception exc) {
                System.Diagnostics.Debug.WriteLine("error: " + exc.Message);
                Error(exc); // (invoked error dialog)
            }
            finally {
                // quit the application and and perform garbage collection
                ((Word._Application)wordApp.Application).Quit();
                wordApp = null;
                GC.Collect();
                // signal that we're done
                System.Diagnostics.Debug.WriteLine("Signaling progress finished");
                ProgressFinished(); 
            }
        });
        thread.Start();
    }

0 ответов

Другие вопросы по тегам