Создание отформатированного (таблицы) отчета с использованием rtf или слова в .net - PullRequest
0 голосов
/ 05 ноября 2011

Мне нужно создать файл отчета из моего приложения don net.Мне нужно поместить данные в табличном формате.Как правило, вы ожидаете, что я буду использовать элемент управления просмотра отчетов Microsoft.но я использую sqlite и не могу автоматически сгенерировать отчет.Также мой отчет основан на нескольких таблицах, а не на конкретной таблице.поэтому я решил использовать RichTextFormat или Word .doc.

мне нужно создать отчет, который выглядит следующим образом

-------------------------------------------------------------------------
|    Column 1     |    Column 2     |    Column 3     |    Column 4     |
-------------------------------------------------------------------------
|                 |                 |                 |                 |
|                 |                 |                 |                 |
|                 |                 |                 |                 |
-------------------------------------------------------------------------

Конечно, строки не фиксированы, но могут быть меньше или,Подскажите, пожалуйста, лучший способ сделать это.

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 ноября 2011

Вы также можете использовать библиотеку взаимодействия и писать напрямую в документ Word. Особенно, если структура документа довольно проста. Недостатки: Word должен быть установлен на компьютере, который будет генерировать отчет. Пример ниже, не забудьте добавить сборки: Microsoft.Office.Interop.Word (... \ Office12 \ Microsoft.Office.Interop.Word.dll), Office (... \ Office12 \ Office.dll).

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Interop.Word;
using Microsoft.Office.Core;
using System.Runtime.InteropServices;
using System.IO;
using System.Diagnostics;

namespace WriteToWordSO
{
    class Program
    {
        static void Main(string[] args)
        {
            _Application app = null;
            Documents docs = null;
            Document doc = null;
            Range range = null;
            Tables tables = null;
            Table table = null;

            object oMissing = System.Reflection.Missing.Value;
            object oFalse = false;
            object oTrue = true;
            object fileName = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "tmp.doc");
            object fileFormat = WdSaveFormat.wdFormatDocument;

            FileInfo fi = new FileInfo(fileName.ToString());
            if (fi.Exists) fi.Delete();

            int rows = 4, cols = 5;

            try
            {
                app = new ApplicationClass();
                app.Visible = false;
                app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
                app.AutomationSecurity = MsoAutomationSecurity.msoAutomationSecurityForceDisable;

                docs = app.Documents;
                doc = docs.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);

                range = doc.Range(ref oMissing, ref oMissing);

                tables = doc.Tables;

                object oAutoFitCell = WdDefaultTableBehavior.wdWord9TableBehavior;
                object oAutoFitWindow = WdAutoFitBehavior.wdAutoFitWindow;

                table = tables.Add(range, rows, cols, ref oAutoFitCell, ref oAutoFitWindow);

                Cell c = null;
                Range cellRange = null;

                // header row
                for (int i = 1; i < cols + 1; i++)
                {
                    c = table.Cell(1, i);
                    cellRange = c.Range;
                    cellRange.Text = "Header " + i.ToString();
                    cellRange.Bold = 1;
                    Marshal.ReleaseComObject(c);
                    Marshal.ReleaseComObject(cellRange);
                }

                // data rows
                for (int i = 1; i < cols + 1; i++)
                {
                    for (int j = 1; j < rows; j++)
                    {
                        c = table.Cell(j + 1, i);
                        cellRange = c.Range;
                        cellRange.Text = "Cell " + i.ToString() + j.ToString();
                        Marshal.ReleaseComObject(c);
                        Marshal.ReleaseComObject(cellRange);
                    }
                }

                doc.SaveAs(ref fileName, ref fileFormat, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing);

                ((_Document)doc).Close(ref oFalse, ref oMissing, ref oMissing);

                ((_Application)app).Quit(ref oFalse, ref oMissing, ref oMissing);

                Process.Start(fileName.ToString());
            }
            finally
            {
                // frees memory

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();

                // its very important to release all used object,
                // otherwise some complications may appear
                if (table != null) Marshal.ReleaseComObject(table);
                table = null;

                if (tables != null) Marshal.ReleaseComObject(tables);
                tables = null;

                if (range == null) Marshal.ReleaseComObject(range);
                range = null;

                if (doc != null) Marshal.ReleaseComObject(doc);
                doc = null;

                if (docs != null) Marshal.ReleaseComObject(docs);
                docs = null;

                if (app != null) Marshal.ReleaseComObject(app);
                app = null;
            }
        }
    }
}
0 голосов
/ 05 ноября 2011

Вы можете использовать "Office Open XML" и создать свой собственный docx writer. Для получения дополнительной информации посмотрите эту вики url В dotnet вы получите определенные пространства имен для этой работы. Надеюсь, это поможет вам.

...