我使用Spreadsheetgear将自定义SQL查询的结果导出为excel文件。
现在我想要改进这个系统:用户将能够上传一个excel模板文件到数据库中(目前是varbinary)。例如,它可以有一个包含计算的工作表,然后在将数据导出到该模板时,它将使用查询中的datatable填充另一个工作表。
spreadsheetgear能做到这一点吗?如果是这样,它是如何工作的-主要是如何加载现有的excel文件作为Spreadsheetgear工作簿/工作簿集?我在他们的文档中找不到任何东西(尽管我仍在寻找)。
编辑:已解决。我手动创建工作簿,从数据库加载模板作为byte[],然后使用OpenFromMemory函数打开所述模板:
// Create workbookSet
SpreadsheetGear.IWorkbookSet workbookSet = SpreadsheetGear.Factory.GetWorkbookSet();
// Create a new empty workbook in the workbookSet.
SpreadsheetGear.IWorkbook workbook = workbookSet.Workbooks.Add();
if(TemplateID != -1) // If this case requires a template
{
// Get template from SQL database (.xlsx stored as varbinary(max))
byte[] template = GetTemplateByID(VorlagenID);
workbook = workbookSet.Workbooks.OpenFromMemory(template);
}
// Create export worksheet
SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets[0];
worksheet.Name = "Export";
[...]在我的例子中,模板总是使用Worksheet1,但是为导出创建一个Worksheet1应该很容易。
发布于 2019-09-04 06:51:11
是的,可以使用SpreadsheetGear设置预先构建的模板文件。我们通过.NET / C# / MSSSQL广泛地使用它。该方法允许您创建非常复杂的模板,然后简单地添加所需的数据。当然,这包括您在模板中构建的任何计算。
方法1-将模板存储在web服务器上,提取创建的用户电子表格并将其写入web服务器上的文件夹。返回文件名以允许按代码或按用户从服务器提取。
public static String SaveTemplateSpreadsheetToServer()
{
// Open the workbook.
var templatename = HostingEnvironment.MapPath("~/Files/MyTemplate.xlsx");
var workbook = Factory.GetWorkbook(templatename );
// Read and write to the spreadsheet
// Save a copy to disk and return filename
var filename = "The_exported_file.xlsx";
var filePath = HostingEnvironment.MapPath("~/FilesTemp/" + filename);
workbook.SaveAs(filePath, FileFormat.OpenXMLWorkbook);
// close workbook
workbook.Close();
// Return the filename
return fileName;
}方法二:将模板存储在the服务器上,将修改后的电子表格提取并保存为字节数组。直接下载附件
public static byte[] SaveTemplateSpreadsheetToServer()
{
// Open the workbook.
var templatename = HostingEnvironment.MapPath("~/Files/MyTemplate.xlsx");
var workbook = Factory.GetWorkbook(templatename );
// Read and write to the spreadsheet
// Save as byte array and send to user
var byteArray = workbook.SaveToMemory(FileFormat.OpenXMLWorkbook);
// close workbook
workbook.Close();
// Return the byte array
return byteArray;
}我们已经对保存在数据库中的二进制模板文件做了一些工作,但发现在web服务器上处理物理模板文件更方便。更容易管理对模板的更改。
我唯一要注意的是避免使用包含大量“垃圾”的非常大的模板(例如图片)。该过程会受到在读/写/导出活动之前将文件加载到内存中所花费的时间的影响。小于1MB是理想的,小于2MB是可管理的。
https://stackoverflow.com/questions/57772367
复制相似问题