1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/duyibo-QuickCode

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 45 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 06.06.2025 21:03 34d9685

Быстрое руководство по QuickCode

Операции с базой данных

Зависимый ядро DLL

Mysoft.QuickCode.dll

Импорт зависимостей

using Mysoft.QuickCode.DAL;

Структура данных BaseEntity, используемая в документах

using System;
using Mysoft.Map.Extensions.DAL;

namespace Mysoft.Test.Entity
{
    [Serializable]
    [DataEntity(Alias = "myUser")]
    public class MyUser : BaseEntity
    {
        [DataColumn(PrimaryKey = true)]
        public Guid UserGUID { set; get; }
        
        [DataColumn(IsNullable = true)]
        public string UserCode { set; get; }
        
        [DataColumn(IsNullable = true)]
        public string UserName { set; get; }
        
        [DataColumn(IsNullable = true)]
        public int IsDisabled { set; get; }
    }
}

Добавление данных

  • Добавление одной записи
// Запись для добавления
var user = new MyUser(){
    UserGUID = Guid.NewGuid(),
    UserName = "Пипи瞎"
};

// Добавление или обновление записи. Если в базе данных по ключу не найдена запись, будет выполнено добавление. В конечном итоге вызывается метод Insert из малой платформы.
QuickDAL.Context.SaveEntity(user);

/*
Разница между этим методом и предыдущим заключается в том, что если значения полей записи не заданы, будет вызван метод SetDefaultValue для установки значения по умолчанию для каждого поля. Обычно используется в сценариях обновления, если не требуется установка всех полей по умолчанию, второй параметр не передается.
*/
QuickDAL.Context.SaveEntity(user, true);
  • Добавление нескольких записей```csharp // Предположим, что здесь добавляются данные для трех пользователей var list = new List(); list.Add(new MyUser(){ UserGUID = Guid.NewGuid(), UserName = "Пипи не видит 1" }); list.Add(new MyUser(){ UserGUID = Guid.NewGuid(), UserName = "Пипи не видит 2" }); list.Add(new MyUser(){ UserGUID = Guid.NewGuid(), UserName = "Пипи не видит 3" });
QuickDAL<MyUser>.Context.BatchInsert(list);

Изменение данных

  • Изменение данных через объект
user.UserName = "Пипи";
user.IsDisabled = 0;  // Если тип данных IsDisabled - int, а не bool?

/*
Обновление данных пользователя. Поскольку тип данных IsDisabled - int, и значение по умолчанию для типа int - OnClickListener, то значение 0 не будет обновлено в базе данных. 
Так как используется метод Update из малой платформы, для обновления значения 0 в базе данных, необходимо использовать метод SetDefaultValue.
*/
QuickDAL.Context.SaveEntity(user);
```/*
Обновление информации о пользователе. Значение IsDisabled будет установлено на 0 в базе данных, а также все другие поля, которые имеют значения по умолчанию, будут обновлены. 
При таком обновлении обязательно сначала получить текущие данные из базы данных, присвоить значения для обновляемых полей и затем выполнить обновление, при этом следует использовать транзакции.
Если использовать метод обновления через создание нового объекта, то все поля, которые уже имеют значения в базе данных, будут обновлены до значений по умолчанию.
*/
QuickDAL.Context.SaveEntity(user, true);
  • Обновление с использованием Expression
var userGUID = Guid.NewGuid();// Этот способ обновления обновляет только те поля, которые указаны.
// Первый параметр: a=>new MyUser(){UserName="皮皮瞎", IsDisabled=0}. Указывает, какие поля обновляются.
// Второй параметр — условия для обновления.
// Перевод: обновить myUser установив UserName='皮皮瞎', IsDisabled=0 где UserGUID='xxxxxx' и IsDisabled<>0
QuickDAL<MyUser>.Context.UpdateEntity(a=>new MyUser(){UserName="皮皮瞎", IsDisabled=0}, 
    a=>a.UserGUID==userGUID && a.IsDisabled!=0);

### **Запрос данных**
- **Запрос одной записи**
```csharp
// Предположим, что известен GUID пользователя
var userGUID = Guid.NewGuid();    
// Получение записи по первичному ключу.
var user = QuickDAL<MyUser>.Context.GetEntity(userGUID);
// Использование Expression для запроса первой записи, соответствующей условиям.
var user1 = QuickDAL<MyUser>.Context.GetEntity(a=>a.UserName=="皮皮瞎");
// В VB, поскольку VB не может автоматически отличить делегаты от обычных параметров, при использовании Expression следует использовать метод GetEntityOne. Пример:
// Dim user1 As MyUser = QuickDAL(Of MyUser).Context.GetEntityOne(Function(a) a.UserName = "皮皮瞎");
  • Запрос множества записей
// Получение записей, где UserCode не пустой или не null
var user = QuickDAL<MyUser>.Context.GetEntityList(a=> a.UserCode <> "" || a.UserCode.Sqlable().IsNotNull());

Удаление данных

В разработке

Другие синтаксисы

  • Exists
// Проверка наличия записей в базе данных, соответствующих условиям
var result = QuickDAL<MyUser>.Context.Exists(a=> a.UserCode <> "" || a.UserCode.Sqlable().IsNotNull());
```- Sqlable объект
> В разработке SQL часто используются другие условия для запроса, такие как: in, is null, is not null и т. д. Для удобства выражения этих условий, ключевые слова были расширены до объекта Sqlable. Например, в следующем примере проверяется, является ли UserCode null:```csharp
QuickDAL<MyUser>.Context.GetEntityList(a => a.UserCode <> "" || a.UserCode.Sqlable().IsNotNull());
```***

## Экспорт в Excel
### **Зависимые DLL**

Mysoft.QuickCode.dll


### **Импорт зависимостей**

```csharp
using Mysoft.QuickCode.Office;

Обзор

Экспорт

Обычный экспорт

  • Обычный экспорт (с форматированием)

Например: форматирование чисел.

![Экспорт](./docs/excel/files/Обычный экспорт (с форматированием).png)

public static void NoTemplateExport()
{
    Random rand = new Random(1000000);

    DataTable table = new DataTable();
    table.Columns.Add("Имя", typeof(string));
    table.Columns.Add("Возраст", typeof(int));
    table.Columns.Add("Денежные средства", typeof(long));
    table.Columns.Add("Примечание", typeof(string));

    for (int i = 1; i <= 100; i++)
    {
        var row = table.NewRow();
        row["Имя"] = $"Ван Фуцай{i}";
        row["Возраст"] = $"{rand.Next(20, 60)}";
        row["Денежные средства"] = $"{Math.Round(rand.Next(100000000, 999999999) * 100M, 2)}";
        row["Примечание"] = $"Неизвестно, почему он так富有{i}";

        table.Rows.Add(row);
    }

    var dataList = table.ToExcelCellList();

    // Можно установить формат некоторых ячеек
    int ageColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("Возраст"));  // Получение индекса столбца "Возраст" с помощью GetExcelCellByField
    int moneyColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("Денежные средства"));
    for (int i = 1; i < dataList.Count; i++)
    {
        var age = dataList[i][ageColIndex];
        age.DataType = "number";
        age.DataFormat = "0";
        age.Align = "right";

        var money = dataList[i][moneyColIndex];
        money.DataType = "number";
        money.DataFormat = "#,##0.00";
        money.Align = "right";
        money.Width = 200;
    }

    var workbook = ExcelCreator.ExportToExcel(null, dataList, null, new ExportExcelSetting()
    {
        Version = OfficeVersion.Office2007Plus
    });
}
```    // Сохранение в файл
    using (FileStream file = new FileStream(@"D:/QC导出测试/Обычный экспорт (с форматированием).xlsx", FileMode.OpenOrCreate))
    {
        workbook.Write(file);
    }
}
  • Обычный экспорт (с заголовками, примечаниями, стилями)

В экспортируемом таблице можно задать собственные стили.Экспорт

public static void NoTemplateExport1()
{
    Random rand = new Random(1000000);

    DataTable table = new DataTable();
    table.Columns.Add("Имя", typeof(string));
    table.Columns.Add("Возраст", typeof(int));
    table.Columns.Add("Активы", typeof(long));
    table.Columns.Add("Примечание", typeof(string));

    for (int i = 1; i <= 100; i++)
    {
        var row = table.NewRow();
        row["Имя"] = $"Ван Фуцай{i}";
        row["Возраст"] = $"{rand.Next(20, 60)}";
        row["Активы"] = $"{Math.Round(rand.Next(100000000, 999999999) * 100M, 2)}";
        row["Примечание"] = $"Неизвестно, почему он так富有{i}";

        table.Rows.Add(row);
    }

    var dataList = table.ToExcelCellList();
    var maxColumn = dataList.First().Count;

    // Заголовок, примечание, стиль
    var title = new List<ExcelCell>();
    var memo = new List<ExcelCell>();
    for (int i = 0; i < maxColumn; i++)
    {
        title.Add(new ExcelCell()
        {
            IsTitle = true,   // Отмечен как заголовок
            Height = 50,
            Text = "Заголовок"
        });

        memo.Add(new ExcelCell()
        {
            IsSummary = true,   // Отмечен как строка с примечанием
            Height = 50,
            FontColor = Mysoft.QuickCode.NPOI.HSSF.Util.HSSFColor.Red.Index,
            Text = @"
1. Описание 1
2. Описание 2
"
        });
    }

    // Добавление в список данных
    dataList.Insert(0, memo);
    dataList.Insert(0, title);
}
```    var workbook = ExcelCreator.ExportToExcel(null, dataList, null, new ExportExcelSetting()
    {
        Version = OfficeVersion.Office2007Plus,
        HeaderRowCount = 3    //Так как добавлен заголовок и строка с примечанием, теперь у нас есть 3 строки заголовков.
    });```csharp
    //Сохранение в файл
    using (FileStream file = new FileStream(@"D:/QC导出测试/常规导出(大标题、备注、样式).xlsx", FileMode.OpenOrCreate))
    {
        workbook.Write(file);
    }
}
  • Обычный экспорт (множественные заголовки)

Экспорт

public static void NoTemplateExport2()
{
    Random rand = new Random(1000000);

    DataTable table = new DataTable();
    table.Columns.Add("Имя", typeof(string));
    table.Columns.Add("Возраст", typeof(int));
    table.Columns.Add("Активы", typeof(long));
    table.Columns.Add("Примечание", typeof(string));

    for (int i = 1; i <= 100; i++)
    {
        var row = table.NewRow();
        row["姓名"] = $"王富贵{i}";
        row["年龄"] = $"{rand.Next(20, 60)}";
        row["资产"] = $"{Math.Round(rand.Next(100000000, 999999999) * 100M, 2)}";
        row["备注"] = $"Неизвестно, почему он так富有{i}";

        table.Rows.Add(row);
    }

    var dataList = table.ToExcelCellList();

    //Множественные уровни заголовков
    var firstRow = new List<ExcelCell>();
    firstRow.Add(new ExcelCell()
    {
        Text = "Персональная информация"
    });
    firstRow.Add(new ExcelCell()
    {
        Text = "Персональная информация"
    });
    firstRow.Add(new ExcelCell()
    {
        Text = "Активы"
    });
    firstRow.Add(new ExcelCell()
    {
        Text = "Примечания"
    });

    //Вставка объединенного заголовочного ряда в таблицу
    dataList.Insert(0, firstRow);

    var workbook = ExcelCreator.ExportToExcel(null, dataList, null, new ExportExcelSetting()
    {
        Version = OfficeVersion.Office2007Plus,
        HeaderRowCount = 2    //Так как был добавлен объединенный ряд, заголовок теперь состоит из двух строк.
    });

    //Сохранение в файл
    using (FileStream file = new FileStream(@"D:/QC导出测试/常规导出(多级表头).xlsx", FileMode.OpenOrCreate))
    {
        workbook.Write(file);
    }
}
```- **Регулярный экспорт (добавление нескольких листов)**

> Экспортируемый контент должен храниться на нескольких листах.

![Экспорт](./docs/excel/files/Регулярный экспорт (добавление нескольких листов).png)

```csharp
public static void NoTemplateExport3()
{
    IWorkbook workbook = null;

    for (int p = 0; p < 5; p++)
    {
        Random rand = new Random(1000000);

        DataTable table = new DataTable();
        table.Columns.Add("Имя", typeof(string));
        table.Columns.Add("Возраст", typeof(int));
        table.Columns.Add("Активы", typeof(long));
        table.Columns.Add("Примечание", typeof(string));

        for (int i = 1; i <= 100; i++)
        {
            var row = table.NewRow();
            row["Имя"] = $"Иванов{i}";
            row["Возраст"] = $"{rand.Next(20, 60)}";
            row["Активы"] = $"{Math.Round(rand.Next(100000000, 999999999) * 100M, 2)}";
            row["Примечание"] = $"Неизвестно почему так богат{i}";

            table.Rows.Add(row);
        }

        var dataList = table.ToExcelCellList();
``````markdown
        workbook = ExcelCreator.ExportToExcel(workbook, dataList, null, new ExportExcelSetting()
        {
            Version = OfficeVersion.Office2007Plus
        },
        sheetName: $"Лист {p}",
        createMode: CreateMode.AppendSheet);
    }

    // Сохранение в файл
    if (File.Exists(@"D:/QC导出测试/常规导出(追加多页签).xlsx"))
    {
        File.Delete(@"D:/QC导出测试/常规导出(追加多页签).xlsx");
    }
    using (FileStream file = new FileStream(@"D:/QC导出测试/常规导出(追加多页签).xlsx", FileMode.OpenOrCreate))
    {
        workbook.Write(file);
    }
}
  • Регулярный экспорт (несколько таблиц на одном листе в формате XLS)

Несколько таблиц данных, которые нужно экспортировать на один лист для отображения всех данных. Эта функция реализована только для версии в формате XLS, версия XLSX пока не реализована.Экспорт

public static void NoTemplateExport4()
{
    var tabKvList = new List<KeyValuePair<string, DataTable>>();

    for (int p = 0; p < 5; p++)
    {
        Random rand = new Random(1000000);

        DataTable table = new DataTable();
        table.Columns.Add("Имя", typeof(string));
        table.Columns.Add("Возраст", typeof(int));
        table.Columns.Add("Денежные средства", typeof(long));
        table.Columns.Add("Примечание", typeof(string));

        for (int i = 1; i <= 3; i++)
        {
            var row = table.NewRow();
            row["Имя"] = $"Ван Фуцай{i}";
            row["Возраст"] = $"{rand.Next(20, 60)}";
            row["Денежные средства"] = $"{Math.Round(rand.Next(100000000, 999999999) * 100M, 2)}";
            row["Примечание"] = $"Неизвестно, почему он так富有{i}";

            table.Rows.Add(row);
        }

        tabKvList.Add(new KeyValuePair<string, DataTable>($"Таблица{p}", table));
    }

    var dst = new DataSetTool(tabKvList);
    IWorkbook workbook = dst.GetWorkbook();

    // Сохранение в файл
    using (FileStream file = new FileStream(@"D:/QC导出测试/常规导出(同页签多个表格XLS格式).xls", FileMode.OpenOrCreate))
    {
        workbook.Write(file);
    }
}

Продвинутый экспорт

  • Продвинутый экспорт (выпадающие списки и связывание)

Управление вводом с помощью выпадающих списков, сценарии связывания выпадающих списков. Встроенная реализация с использованием менеджера имен. Рекомендуется использовать экспорт в формате XLSX, так как в более ранних версиях Excel есть ограничение на длину символов (255), что может привести к нефункциональности.Экспорт```csharp public void Export() { string fileName = @"D:/QC导出测试/高级导出(下拉框及联动).xlsx"; if (File.Exists(fileName)) { File.Delete(fileName); }

IWorkbook workbook = new XSSFWorkbook();


#region Создание списка для выпадающего списка и управления именами

//Таблица данных для обычного выпадающего списка
List<List<ExcelCell>> dpd1List = new List<List<ExcelCell>>();
var dpl1Name = "Таблица с вариантами 1";
for (int i = 0; i < 200; i++)
{
    //Создание списка вариантов для выпадающего списка
    var row = new List<ExcelCell>();
    row.Add(new ExcelCell()
    {
        Field = $"Field1",
        Text = $"Вариант выпадающего списка {i}"
    });
    dpd1List.Add(row);
}
ExcelCreator.NumberToAZRender(dpd1List);    //Рендеринг координат ячеек в Excel, только после рендера можно получить XY значения

}

    workbook = ExcelCreator.ExportToExcel(workbook, dpd1List, fileName, new ExportExcelSetting()
    {
        HeaderRowCount = 0, // 0 - все данные в List<List<ExcelCell>> являются данными, без заголовков
        Version = OfficeVersion.Office2007Plus,
        // Создание управления именами, которое можно использовать для обычного выпадающего списка и связанных выпадающих списков
        NameManager = new Dictionary<string, string>() {
            {
                "Name1",    // Фиксированное имя можно назвать произвольно, так как имена в управлении именами уникальны и не должны повторяться, поэтому фиксированные выпадающие списки следует избегать повторения с динамически создаваемыми именами.
                $"{dpl1Name}!{dpd1List.First().First().AbsoluteXY}:{dpd1List.Last().First().AbsoluteXY}"    // Получение диапазона значений управления именами через XY значения
            }
        },
        SheetHidden = 1 // Скрытие вкладки
    }, null, dpl1Name, CreateMode.AppendSheet);    #endregion


    #region Создание страницы данных для управления именами и соответствующего управления именами

    List<KeyValuePair<string, List<string>>> nameList = new List<KeyValuePair<string, List<string>>>();```markdown
    // Обратите внимание, что имя менеджера не поддерживает цифры, следует использовать только кириллицу и латиницу
    var kv1 = new KeyValuePair<string, List<string>>("Основная категория", new List<string>() { "AA", "AB", "AC", "AD", "AE" });
    var kv2 = new KeyValuePair<string, List<string>>("AA", new List<string>() { "B1", "B2", "B3", "B4" });
    var kv3 = new KeyValuePair<string, List<string>>("AB", new List<string>() { "C1", "C2", "C3", "C4", "C5" });
    var kv4 = new KeyValuePair<string, List<string>>("AC", new List<string>() { "D1", "D2", "D3" });
```    nameList.Add(kv1);
    nameList.Add(kv2);
    nameList.Add(kv3);
    nameList.Add(kv4);

    // Сначала преобразуем вышеуказанные данные-образцы в таблицу EXCEL
    List<List<ExcelCell>> nameRows = new List<List<ExcelCell>>();
    int maxColumns = nameList.Max(m => m.Value.Count());    // Берем максимальное количество записей как максимальное количество колонок в EXCEL
    for (int i = 0; i < nameList.Count; i++)
    {
        var names = nameList[i];
        var cells = new List<ExcelCell>();

        // Ключ, то есть первая колонка, добавляем в таблицу
        cells.Add(new ExcelCell()
        {
            Field = "field",    // Имя поля может быть произвольным, главное, чтобы оно не повторялось, как в DataTable
            Text = names.Key
        });

        // Инициализируем последующие колонки
        for (int j = 0; j < maxColumns; j++)
        {
            cells.Add(new ExcelCell()
            {
                Field = $"field{j}" // Имя поля может быть произвольным, главное, чтобы оно не повторялось, как в DataTable
            });
        }        // Записываем значения в ячейки
        for (int j = 0; j < names.Value.Count; j++)
        {
            cells[j + 1].Text = names.Value[j];
        }

        // Добавляем строки данных
        nameRows.Add(cells);
    }
    ExcelCreator.NumberToAZRender(nameRows);

    // Создаем переменную для управления именами
    var nameManager = new Dictionary<string, string>();
    var nameSheetName1 = "Имя_лист1";   // Имена листов EXCEL не должны повторяться
    foreach (var row in nameRows)
    {
        var firstEmptyIndex = row.FindLastIndex(m => string.IsNullOrEmpty(m.Text) == false); // Находим последнюю непустую ячейку для диапазона значений
        var name = row.First(); // Первый элемент - это имя
        var subList = row.Skip(1).Take(firstEmptyIndex);    // Берем данные из непустых ячеек как подкатегории, так как первая колонка уже игнорируется
        if (subList.Count() > 0)
        {
            nameManager.Add(
                name.Text,    // Имя в менеджере имен: должно быть уникальным и не повторяться
                $"{nameSheetName1}!{subList.First().AbsoluteXY}:{subList.Last().AbsoluteXY}"    // Диапазон ячеек для ссылки на значения
            );
        }
    }    // Выходное название менеджера вкладок
    workbook = ExcelCreator.ExportToExcel(workbook, nameRows, fileName,
        new ExportExcelSetting()
        {
            HeaderRowCount = 0,
            Version = OfficeVersion.Office2007Plus,
            NameManager = nameManager,
            SheetHidden = 1 // скрыть вкладку
        },
        null,
        nameSheetName1,
        CreateMode.AppendSheet);    #endregion


    #region Экспорт бизнес-данных, во время экспорта используются данные из выпадающего списка или имя менеджера данных    //Таблица бизнес-данных
    List<List<ExcelCell>> lstTable = new List<List<ExcelCell>>();
    var dataSheetName = "Основные данные";
    //Тестирование производительности для 30 000 строк данных
    for (int i = 0; i < 50; i++)
    {
        List<ExcelCell> row = new List<ExcelCell>();
        int colNums = 100;  //Генерация 100 столбцов данных
        if (i == 0)
        {
            //Первая строка предполагается как заголовок таблицы
            for (int j = 0; j < colNums; j++)
            {
                row.Add(new ExcelCell()
                {
                    Field = $"Поле{j}",
                    Text = $"Поле{j}"
                });
            }
        }
        else
        {
            //Строки данных
            for (int j = 0; j < colNums; j++)
            {
                row.Add(new ExcelCell()
                {
                    Field = $"Поле{j}",
                    Text = (10 * i + j).ToString()
                });
            }
        }
        lstTable.Add(row);
    }
    ExcelCreator.NumberToAZRender(dpd1List);    //Рендеринг координат ячеек в Excel, только после рендера можно получить значения XY, если не требуется получать координаты из кода, то вызов не требуется, логика экспорта вызывает автоматически
    var settings = GetCellSetting();    //Экспорт настроек для ячеек
    workbook = ExcelCreator.ExportToExcel(workbook, lstTable, fileName, new ExportExcelSetting()
    {
        HeaderRowCount = 1,
        ECellable = true,   //Поддержка рендера формул только для продвинутого экспорта
        ProtectSheet = true, //Отключение защиты листа, включение защиты может привести к невозможности редактирования части данных
        SheetIndex = 0,   //Созданный лист помещается на первую страницу
        Version = OfficeVersion.Office2007Plus
    }, settings, dataSheetName, CreateMode.AppendSheet);```markdown
/// <summary>
/// Экспорт настроек формул
/// </summary>
/// <returns></returns>
public Dictionary<string, Func<object, List<ExcelCell>, ExcelCell, int, ExcelCellSetting>> GetCellSetting()
{
    //словарь настроек формул для столбцов
    Dictionary<string, Func<object, List<ExcelCell>, ExcelCell, int, ExcelCellSetting>> dict = new Dictionary<string, Func<object, List<ExcelCell>, ExcelCell, int, ExcelCellSetting>>();
    var dpdSetting = new DropDownSetting()
    {
        NameOrReference = "Name1"   //обычный выпадающий список, соответствующий имени в менеджере имен
    };
}
    //Настройка логики обработки процесса рендеринга
    //1. Пример обычного выпадающего списка
    dict.Add("Поле3", //Добавление логики обработки для столбца, то есть значение поля ExcelCell.Field, соответствующее этому столбцу. Например, добавляем логику обработки для "Поле3" при экспорте
        (value, row, column, rowIndex) =>
        {
            column.BackgroundColor = HSSFColor.LightYellow.Index;   //Цвет редактируемого поля можно установить в специальный цвет
                                                                    //Установка параметров обычного выпадающего списка
            return new ExcelCellSetting
            {
                DPDSetting = dpdSetting
            };
        });
```    //2. Пример связанного выпадающего списка
    dict.Add("Поле5", // Например, "Поле5" представляет собой основную категорию в менеджере имен
        (value, row, column, rowIndex) =>
        {
            column.BackgroundColor = HSSFColor.LightYellow.Index;   // Цвет редактируемого поля можно установить в специальный цвет
            // Установка параметров обычного выпадающего списка
            return new ExcelCellSetting
            {
                DPDSetting = new DropDownSetting()
                {
                    NameOrReference = "Основная категория" // Имя основной категории в менеджере имен
                }
            };
        });
    dict.Add("Поле6", // Например, "Поле6" должно зависеть от значений "Поле5"
        (value, row, column, rowIndex) =>
        {
            column.BackgroundColor = HSSFColor.LightYellow.Index;   // Цвет редактируемого поля можно установить в специальный цвет```csharp
            // Поиск связанного поля
            var depend = row.First(m => m.Field == "Поле5"); // Поле зависит от "Поле5" в текущей строке
            return new ExcelCellSetting
            {
                DPDSetting = new DropDownSetting()
                {
                    IsIndirect = true,    // true указывает на режим связи через менеджер имен
                    NameOrReference = $"INDIRECT({depend.AbsoluteXY})"  // Формула связи
                }
            };
        });

    return dict;
}
  • Расширенный экспорт (правила вычисления формул)

Для определенного столбца или строки можно установить формулу или режим только для чтения.

Экспорт

public void Export()
{
    string fileName = @"D:/QC_экспорт_тест/Расширенный_экспорт_правила_вычисления_формул.xlsx";
    if (File.Exists(fileName))
    {
        File.Delete(fileName);
    }
}    Random rand = new Random(1000000);

    DataTable table = new DataTable();
    table.Columns.Add("Номер квартиры", typeof(string));
    table.Columns.Add("Площадь", typeof(decimal));
    table.Columns.Add("Цена за м²", typeof(decimal));
    table.Columns.Add("Общая стоимость", typeof(decimal));
    table.Columns.Add("Примечание", typeof(string));

    for (int i = 1; i <= 100; i++)
    {
        var row = table.NewRow();
        row["Номер квартиры"] = $"F2021-{i}";
        row["Площадь"] = $"{rand.Next(90, 140)}";
        row["Цена за м²"] = $"{rand.Next(20000, 50000)}";
        row["Общая стоимость"] = 0M;
        row["Примечание"] = $"Покупка{i}";

        table.Rows.Add(row);
    }

    var dataList = table.ToExcelCellList();
```    // Можно настроить формат некоторых ячеек
    int numColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("Номер квартиры"));
    int sqColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("Площадь"));  // Используем GetExcelCellByField для поиска ячеек по полю
    int prColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("Цена за м²"));
    for (int i = 1; i < dataList.Count; i++)
    {
        // Заблокировать номер квартиры
        var num = dataList[i][numColIndex];
        num.Settings.Locked = true;
    }        // Формат чисел
        var sq = dataList[i][sqColIndex];
        sq.DataType = "number";
        sq.DataFormat = "0";
        sq.Align = "right";

        var pr = dataList[i][prColIndex];
        pr.DataType = "number";
        pr.DataFormat = "#,##0.00";
        pr.Align = "right";
    }

    var workbook = ExcelCreator.ExportToExcel(null, dataList, null, new ExportExcelSetting()
    {
        Version = OfficeVersion.Office2007Plus,
        ECellable = true  // Включить продвинутую поддержку экспорта, чтобы поддерживать формулы и защиту ячеек
    }, delegateCellSettings: GetExportFormula());

    // Сохранить в файл
    using (FileStream file = new FileStream(fileName, FileMode.OpenOrCreate))
    {
        workbook.Write(file);
    }
}

/// <summary>
/// Настройки экспорта формул
/// </summary>
/// <returns></returns>
public Dictionary<string, Func<object, List<ExcelCell>, ExcelCell, int, ExcelCellSetting>> GetExportFormula()
{
    // Словарь настроек формул для столбцов
    Dictionary<string, Func<object, List<ExcelCell>, ExcelCell, int, ExcelCellSetting>> dict = new Dictionary<string, Func<object, List<ExcelCell>, ExcelCell, int, ExcelCellSetting>>();

    // Настройка логики обработки процесса рендеринга
    dict.Add("Площадь", // Заблокировать площадь
        (value, row, column, rowIndex) =>
        {
            return new ExcelCellSetting
            {
                Locked = false
            };
        });

    dict.Add("Общая стоимость", // Настроить формулу для поля "Общая стоимость"
        (value, row, column, rowIndex) =>
        {
            // Настроить формат
            column.DataFormat = "#,##0.00";
            column.DataType = "number";
            column.Align = "right";

            // Настроить формулу
            // Общая стоимость = Цена за единицу * Площадь
            var dj = row.GetExcelCellByField("Цена за единицу").XY;
            var mj = row.GetExcelCellByField("Площадь").XY;
}        return new ExcelCellSetting
        {
            Formula = $"{dj}*{mj}",    // Excel formula string: price per unit * area
            Locked = true // Lock the calculated cell
        };
    });```csharp
return dict;
}
  • Продвинутый экспорт (нерегулярные вычислительные формулы)

Только определенные позиции ячеек требуют настройки формул, установки только для чтения. Необходимо быстро находить ячейки в любом месте для динамической настройки формул и т.д.

Экспорт

public void Export2()
{
    string fileName = @"D:/QC导出测试/高级导出(不规则计算公式).xlsx";
    if (File.Exists(fileName))
    {
        File.Delete(fileName);
    }


    Random rand = new Random(1000000);

    DataTable table = new DataTable();
    table.Columns.Add("Номер квартиры", typeof(string));
    table.Columns.Add("Площадь", typeof(decimal));
    table.Columns.Add("Цена за единицу", typeof(decimal));
    table.Columns.Add("Общая стоимость", typeof(decimal));
    table.Columns.Add("Примечание", typeof(string));

    for (int i = 1; i <= 100; i++)
    {
        var row = table.NewRow();
        row["Номер квартиры"] = $"F2021-{i}";
        row["Площадь"] = $"{rand.Next(90, 140)}";
        row["Цена за единицу"] = $"{rand.Next(20000, 50000)}";
        row["Общая стоимость"] = 0M;
        row["Примечание"] = $"купить{i}";

        table.Rows.Add(row);
    }
}
```    var dataList = table.ToExcelCellList();
    var maxColumn = dataList.First().Count;
}
<!-- Можно установить некоторые форматы для ячеек -->
int fhColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("房号"));
int mjColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("площадь"));  <!-- Используем GetExcelCellByField для поиска ячеек по полю -->
int djColIndex = dataList.First().IndexOf(dataList.First().GetExcelCellByField("цена за м²"));
for (int i = 1; i < dataList.Count; i++)
{
    // Заблокировать "房号"
    var fh = dataList[i][fhColIndex];
    fh.Settings.Locked = true;
}        
    var nn = dataList[i][mjColIndex];
    nn.DataType = "число";
    nn.DataFormat = "0";
    nn.Align = "право";        var zc = dataList[i][djColIndex];
    zc.DataType = "число";
    zc.DataFormat = "#,##0.00";
    zc.Align = "вправо";
}

//Добавляем строки с ценой, общей стоимостью и средним значением, а также настраиваем формулы для расчета
var avgRow = new List<ExcelCell>();
var totalRow = new List<ExcelCell>();
for (int i = 0; i < maxColumn; i++)
{
    if (i == 0)
    {
        avgRow.Add(new ExcelCell()
        {
            Field = table.Columns[i].ColumnName,
            Text = "средняя цена",
            Settings = new ExcelCellSetting()
            {
                Locked = true
            }
        });

        totalRow.Add(new ExcelCell()
        {
            Field = table.Columns[i].ColumnName,
            Text = "средняя общая стоимость",
            Settings = new ExcelCellSetting()
            {
                Locked = true
            }
        });
    }
    else
    {
        //Заполняем ячейки
        avgRow.Add(new ExcelCell()
        {
            Field = table.Columns[i].ColumnName
        });
        totalRow.Add(new ExcelCell()
        {
            Field = table.Columns[i].ColumnName
        });
    }
}
dataList.Add(avgRow);
dataList.Add(totalRow);

var workbook = ExcelCreator.ExportToExcel(null, dataList, null, new ExportExcelSetting()
{
    Version = OfficeVersion.Office2007Plus,
    ECellable = true  //Включаем продвинутую поддержку экспорта, чтобы поддерживать формулы и защиту ячеек
}, delegateCellSettings: GetExport2Formula(dataList));

//Сохраняем в файл
using (FileStream file = new FileStream(fileName, FileMode.OpenOrCreate))
{
    workbook.Write(file);
}

}///

/// Настройка экспорта формул /// /// public Dictionary<string, Func<object, List, ExcelCell, int, ExcelCellSetting>> GetExport2Formula(List<List> dataList) { // Словарь настроек формул для столбцов Dictionary<string, Func<object, List, ExcelCell, int, ExcelCellSetting>> dict = new Dictionary<string, Func<object, List, ExcelCell, int, ExcelCellSetting>>(); // Настройка логики обработки процесса рендеринга dict.Add("площадь", // блокировка площади (value, row, column, rowIndex) => { // Настройка формулы для нерегулярных точек if (row.GetExcelCellByField("номер_квартиры").TrimText == "средняя_цена") { column.DataType = "number"; column.Align = "right"; column.DataFormat = "#,##0.00"; return new ExcelCellSetting { Locked = true, Formula = $"AVERAGE({dataList[1].GetExcelCellByField("цена").XY}:{dataList[dataList.Count - 2].GetExcelCellByField("цена").XY})" }; } else if (row.GetExcelCellByField("номер_квартиры").TrimText == "средняя_стоимость") { column.DataType = "number"; column.Align = "right"; column.DataFormat = "#,##0.00"; return new ExcelCellSetting { Locked = true, Formula = $"AVERAGE({dataList[1].GetExcelCellByField("стоимость").XY}:{dataList[dataList.Count - 2].GetExcelCellByField("стоимость").XY})" }; } else { return new ExcelCellSetting { Locked = false }; } }); } dict.Add("стоимость", //настройка формулы для поля "стоимость" (value, row, column, rowIndex) => { //Настройка формата column.DataFormat = "#,##0.00"; column.DataType = "число"; column.Align = "право";

        //Настройка формулы
        //стоимость = цена * площадь
        var цена = row.GetExcelCellByField("цена").XY;
        var площадь = row.GetExcelCellByField("площадь").XY;

        return new ExcelCellSetting
        {
            Formula = $"{цена}*{площадь}",    //строка формулы Excel: цена * площадь
            Locked = true //блокировка вычисляемой ячейки
        };
    });    dict.Add("цена за единицу", //Для комнат с нечетными номерами запрещено изменять цену за единицу
    (value, row, column, rowIndex) =>
    {
        if (column.TrimText.EndsWith("1") || column.TrimText.EndsWith("3") || column.TrimText.EndsWith("5") || column.TrimText.EndsWith("7") || column.TrimText.EndsWith("9"))
        {
            return new ExcelCellSetting
            {
                Locked = true
            };
        }
        else
        {
            return new ExcelCellSetting
            {
                Locked = false
            };
        }
    });## API для экспорта в Excel

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/duyibo-QuickCode.git
git@api.gitlife.ru:oschina-mirror/duyibo-QuickCode.git
oschina-mirror
duyibo-QuickCode
duyibo-QuickCode
master