Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/35: Рейтинг темы: голосов - 35, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 13
1

Создание таблиц в MS Word

28.05.2017, 02:29. Просмотров 7235. Ответов 7


Здравствуйте, уважаемые форумчане!

Пишу курсовой проект по теме выпуска методической продукции и столкнулся возможно с глупой, но очень неприятной ситуацией.
Нужно написать программу для формирования отчёта в такой таблице:

Создание таблиц в MS Word


Отчёт должен формироваться в Word-документе, но я, к сожалению, не нашёл в интернете информации по созданию подобных таблиц в Word через язык C#.

Пожалуйста, помогите с созданием или поиском информации, может я плохо искал?
Буду благодарен любой помощи!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2017, 02:29
Ответы с готовыми решениями:

Создание нескольких таблиц в Word
Всем привет. Пишу на Delphi, но вопрос скорее по VBA, если я не прав, направьте меня по верному...

ASP.NET+C#: Создание таблиц с большим числом колонок в документах Word
Добрый день! Сразу к делу. Есть задача конвертирования на C# таблиц asp::GridView в документы...

Word: макрос для таблиц. Отформатировать определенный вид таблиц
В документе два вида таблиц. Первый тип таблиц имеет вертикальную шапку сбоку (левый столбец) и...

Создание базы данных на лету, создание и заполнение таблиц в базе DB (Paradox? или..).
Здравствуйте Профи! --- Видел я "простенькую" (exe-шник небольшого размера, запускается сразу,...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
7
1413 / 1149 / 802
Регистрация: 29.02.2016
Сообщений: 3,514
28.05.2017, 12:41 2
https://msdn.microsoft.com/ru-... 02h4a.aspx
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 13
28.05.2017, 13:32  [ТС] 3
Видел, но здесь ведь не написано как удалять ячейки в таблице или растянуть её.
0
8127 / 4396 / 1725
Регистрация: 11.02.2013
Сообщений: 9,359
28.05.2017, 18:04 4
MultiGramen, что из этой таблицы тебе нужно добавлять динамически?
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 13
28.05.2017, 20:36  [ТС] 5
Нужно сделать так, чтобы такая таблица создавалась в Word-документе и в ячейки можно было вводить значения.
0
8127 / 4396 / 1725
Регистрация: 11.02.2013
Сообщений: 9,359
28.05.2017, 20:42 6
Создавать её программно — лишняя трата времени. Нужен шаблон, в котором задать хотя бы шапку. На основе шаблона создавать документ и уже в нем добавлять данные.
Поэтому повторяю свой вопрос: какие именно данные будут добавляться программно?
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 13
28.05.2017, 21:53  [ТС] 7
Шаблон выделен красным цветом. Изменяемые в программе значения — зелёным.
Создание таблиц в MS Word
0
8127 / 4396 / 1725
Регистрация: 11.02.2013
Сообщений: 9,359
29.05.2017, 05:24 8
я бы делал это в таблицах Excel. Но можно и в Word.
Шаблон примерно такой:
gridTemplate.zip
В таблице два вида записей: те, что выделены жирным шрифтом и обычные. В модели данных я назвал первые Category, а вторые Discipline. Общие свойства я объединил в абстрактный класс AcademicLoad. Также для описания обязательной нагрузки сделан класс StatutoryLoad
Модель данных

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Category : AcademicLoad
{
    public Category(string index)
        : base(index) { }
 
    public Category()
        : base()
    {
 
    }
    /// <summary>
    /// Дисциплины в данной категории
    /// </summary>
    public List<Discipline> Disciplines { get; } = new List<Discipline>();
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Discipline : AcademicLoad
{
    /// <summary>
    /// Формы промежуточной аттестации
    /// </summary>
    public string[] MidtermAssessment { get; } = new string[8];
    /// <summary>
    /// Распределение обязательной нагрузки
    /// </summary>
    public int[] WorkloadDistribution { get; } = new int[8];
 
    public Discipline(string index)
        : base(index) { }
 
    public Discipline()
        : base()
    {
            
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public abstract class AcademicLoad
{
    protected AcademicLoad(string index)
    {
        Index = index;
    }
 
    protected AcademicLoad()
    {
 
    }
    /// <summary>
    /// Название категории или дисциплины
    /// </summary>
    public string Title { get; set; }
    /// <summary>
    /// Индекс
    /// </summary>
    public string Index { get; set; }
    /// <summary>
    /// Максимальная нагрузка
    /// </summary>
    public int MaxLoad { get; set; }
    /// <summary>
    /// Самостоятельная работа
    /// </summary>
    public int SelfGuided { get; set; }
    /// <summary>
    /// Обязательная нагрузка
    /// </summary>
    public StatutoryLoad StatutoryLoad { get; set; } = new StatutoryLoad();
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// Обязательная нагрузка
/// </summary>
public class StatutoryLoad
{
    /// <summary>
    /// Всего
    /// </summary>
    public int Total { get; set; }
    /// <summary>
    /// ЛИЗ без деления
    /// </summary>
    public int LIZWithoutDivision { get; set; }
    /// <summary>
    /// ЛИЗ с делением
    /// </summary>
    public int LIZWithDivision { get; set; }
    /// <summary>
    /// Курсовой проект (работа)
    /// </summary>
    public int TermProject { get; set; }
}

Остаётся разработать методы для добавления в таблицу категории и дисциплины. Этим и всей остальной работой по отчёту занимается класс Report:
Класс Report
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
public class Report : IDisposable
{
    private const float CENTIMETRES_TO_POINTS = 28.34646f;
    private dynamic _wdDoc;
    private dynamic _wdApp;
    /// <summary>
    /// Создание нового экземпляра отчёта на основе шаблона.
    /// </summary>
    /// <param name="template">Путь к шаблону.</param>
    /// <param name="visible">Показывать ли окно приложения во время работы.</param>
    public Report(string template, bool visible = false)
    {
        NewDoc(template, visible);
    }
 
    private void NewDoc(string template, bool visible)
    {
        OpenApp(visible);
        CreateDoc(template);
    }
 
    private void OpenApp(bool visible)
    {
        var type = Type.GetTypeFromProgID("Word.Application", false);
        if (type == null)
        {
            throw new InvalidOperationException("Не удалось запустить приложение Word. Возожно оно не установлено.");
        }
        _wdApp = Activator.CreateInstance(type);
        _wdApp.Visible = visible;
    }
 
    private void CreateDoc(string template)
    {
        _wdDoc = _wdApp.Documents.Add(Template: template);
    }
    /// <summary>
    /// Добавление категории в документ.
    /// </summary>
    public void AddCategory(Category category)
    {
        var table = AddRow();
 
        var row = (int)table.Rows.Count;
        table.Cell(row, 1).Range.Font.Bold = 1;
        table.Cell(row, 2).Range.Font.Bold = 1;
 
        table.Cell(row, 1).Range.Text = category.Index;
        table.Cell(row, 2).Range.Text = category.Title;
            
        table.Cell(row, 11).Range.Text = category.MaxLoad.GetString();
        table.Cell(row, 12).Range.Text = category.SelfGuided.GetString();
        table.Cell(row, 13).Range.Text = category.StatutoryLoad.Total.GetString();
 
        table.Cell(row, 14).Range.Text = category.StatutoryLoad.LIZWithoutDivision.GetString();
        table.Cell(row, 14).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 15).Range.Text = category.StatutoryLoad.LIZWithDivision.GetString();
        table.Cell(row, 15).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 16).Range.Text = category.StatutoryLoad.TermProject.GetString();
        table.Cell(row, 16).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        AutoSizeRow(table, row);
    }
    /// <summary>
    /// Сохранение документа.
    /// </summary>
    /// <param name="fileName">Полный путь к файлу.</param>
    public void Save(string fileName)
    {
        float appVersion = float.Parse(_wdApp.Version.ToString(), CultureInfo.InvariantCulture);
        if (appVersion < 14)
        {
            _wdDoc.SaveAs(fileName);
        }
        else
        {
            _wdDoc.SaveAs2(fileName);
        }
    }
    /// <summary>
    /// Добавление дисциплины в список.
    /// </summary>
    public void AddDiscipline(Discipline discipline)
    {
        var table = AddRow();
        var row = (int)table.Rows.Count;
        table.Cell(row, 1).Range.Font.Bold = 0;
        table.Cell(row, 2).Range.Font.Bold = 0;
 
        table.Cell(row, 1).Range.Text = discipline.Index;
        table.Cell(row, 2).Range.Text = discipline.Title;
 
        for (var i = 0; i < discipline.MidtermAssessment.Length; i++)
        {
            table.Cell(row, i + 3).Range.Text = discipline.MidtermAssessment[i];
        }
 
        table.Cell(row, 11).Range.Text = discipline.MaxLoad.GetString();
        table.Cell(row, 12).Range.Text = discipline.SelfGuided.GetString();
        table.Cell(row, 13).Range.Text = discipline.StatutoryLoad?.Total.GetString();
 
        table.Cell(row, 14).Range.Text = discipline.StatutoryLoad?.LIZWithoutDivision.GetString();
        table.Cell(row, 14).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 15).Range.Text = discipline.StatutoryLoad?.LIZWithDivision.GetString();
        table.Cell(row, 15).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        table.Cell(row, 16).Range.Text = discipline.StatutoryLoad?.TermProject.GetString();
        table.Cell(row, 16).Range.Orientation = 0;//wdTextOrientationHorizontal;
 
        for (var i = 0; i < discipline.WorkloadDistribution.Length; i++)
        {
            table.Cell(row, i + 17).Range.Text = discipline.WorkloadDistribution[i].GetString();
        }
 
        AutoSizeRow(table, row);
    }
    /// <summary>
    /// Добавление нескольких диспциплин.
    /// </summary>
    public void AddDisciplines(IEnumerable<Discipline> disciplines)
    {
        foreach (var discipline in disciplines)
        {
            AddDiscipline(discipline);
        }
    }
    /// <summary>
    /// Добавление строки в таблицу.
    /// </summary>
    /// <returns>Возвращает таблицу с добавленной строкой.</returns>
    private dynamic AddRow()
    {
        var table = _wdDoc.Tables[1];
        table.Rows.Add();
        return table;
    }
    /// <summary>
    /// Подгонка высоты строки.
    /// </summary>
    /// <param name="table">Таблица</param>
    /// <param name="row">Номер строки, начиная с 1.</param>
    /// <param name="height">Минимальная высота</param>
    private static void AutoSizeRow(dynamic table, int row, float height = 0.1f)
    {
        table.Cell(row, 11).Range.Rows.HeightRule = 1;//wdRowHeightAtLeast
        table.Cell(row, 11).Range.Rows.Height = height * CENTIMETRES_TO_POINTS;
    }
 
    private void Close()
    {
        _wdDoc?.Close();
        _wdApp?.Quit(false);
    }
 
    #region Implementation of IDisposable
 
    public void Dispose()
    {
        Close();
    }
 
    #endregion
}

Я использую позднее связывание через dynamiс, чтобы не зависеть от установленной версии Word.
Библиотека с моделью данных, её тесты и пример использования на WinForms лежат здесь.
Это уже можно использовать в качестве отправной точки.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2017, 05:24

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Автоматическое создание таблиц из наименований таблиц, имен полей, типов полей
Форумчане, доброго времени суток! Есть таблица в которую автоматом выгрузили имена всех таблиц,...

Формирование таблиц Word
Доброго времени суток, господа программеры! Есть небольшая проблемка, пытаюсь ее решить, теперь и с...

Баг таблиц Word
Добрый день форумчане. Столкнулся с такой проблемой: У некоторых таблиц в ворде случайным образом...

Редактирование таблиц в WOrD
Как можно уменьшить время форматирования таблиц ? В данный момент макрос перебирает каждую строку,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.