Mysoft.QuickCode.dll
using Mysoft.QuickCode.DAL;
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);
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);
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());
В разработке
// Проверка наличия записей в базе данных, соответствующих условиям
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;
Например: форматирование чисел.
.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);
}
}
```- **Регулярный экспорт (добавление нескольких листов)**
> Экспортируемый контент должен храниться на нескольких листах.
.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, версия 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);
}
}///
//Настройка формулы
//стоимость = цена * площадь
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 )