Create XLSX price-list generator in .NET
July 12, 2021
// The project, which uses this code, must have references to the following assemblies:
// - Vintasoft.Imaging
// - Vintasoft.Imaging.Office.OpenXml
/// <summary>
/// Generates XLSX pricelist, which is based on XLSX document template.
/// </summary>
public static void GenerateXlsxPricelist()
{
// create XLSX document editor and use file "Pricelist_template.xlsx" as document template
using (Vintasoft.Imaging.Office.OpenXml.Editor.XlsxDocumentEditor editor =
new Vintasoft.Imaging.Office.OpenXml.Editor.XlsxDocumentEditor("Pricelist_template.xlsx"))
{
// generate test pricelist data
PriceListItem[] testData = GetTestData();
// fill pricelist data
FillPricelistData(editor, testData);
// save pricelist to a XLSX document
editor.Save("Pricelist.xlsx");
}
}
/// <summary>
/// Fills the pricelist data using XLSX document editor.
/// </summary>
/// <param name="documentEditor">The DOCX document editor.</param>
/// <param name="pricelistData">The pricelist data.</param>
private static void FillPricelistData(
Vintasoft.Imaging.Office.OpenXml.Editor.XlsxDocumentEditor documentEditor,
PriceListItem[] pricelistData)
{
// set current date in document
documentEditor.Body["[date]"] = System.DateTime.Now.ToShortDateString();
// get the first sheet in document
Vintasoft.Imaging.Office.OpenXml.Editor.XlsxDocumentSheet sheet = documentEditor.Sheets[0];
// get template row in document
Vintasoft.Imaging.Office.OpenXml.Editor.XlsxDocumentSheetRow templateRow = sheet.FindRow("[n]");
int itemNumber = 1;
// for each item in price list
foreach (PriceListItem item in pricelistData)
{
// copy template row and insert copy after template row
Vintasoft.Imaging.Office.OpenXml.Editor.XlsxDocumentSheetRow currentRow = templateRow;
templateRow = (Vintasoft.Imaging.Office.OpenXml.Editor.XlsxDocumentSheetRow)templateRow.InsertCopyAfterSelf();
// fill data in current row
currentRow.FindCell("[n]").Number = itemNumber;
currentRow.FindCell("[product]").Text = item.Product;
currentRow.FindCell("[price]").Number = item.Price;
// get image object, which stores product image, in current row
Vintasoft.Imaging.Office.OpenXml.Editor.OpenXmlDocumentImage image = sheet.FindImages(currentRow)[0];
// if product has image
if (!string.IsNullOrEmpty(item.ImageId))
{
// set product image in image object
using (Vintasoft.Imaging.VintasoftImage productImage = new Vintasoft.Imaging.VintasoftImage(item.ImageId))
image.SetImage(productImage, true);
}
else
{
// remove image object from current row
image.Remove();
}
itemNumber++;
}
// remove template row from result document
templateRow.Remove();
}
/// <summary>
/// Returns the price list test data.
/// </summary>
/// <returns>The price list test data.</returns>
public static PriceListItem[] GetTestData()
{
return new PriceListItem[] {
new PriceListItem("VintaSoft Imaging .NET SDK, Developer license for Desktop PCs", "vsimaging-icon.png", 219.95f),
new PriceListItem("VintaSoft Imaging .NET SDK, Developer license for Servers", "vsimaging-icon.png", 549.95f),
new PriceListItem("VintaSoft Imaging .NET SDK, Site license for Desktop PCs", "vsimaging-icon.png", 659.95f),
new PriceListItem("VintaSoft Imaging .NET SDK, Site license for Servers", "vsimaging-icon.png", 1649.95f),
new PriceListItem("VintaSoft Imaging .NET SDK, Single Server license", "vsimaging-icon.png", 164.95f),
new PriceListItem("VintaSoft Annotation .NET Plug-in, Site license for Desktop PCs", "vsannotation-icon.png", 449.95f),
new PriceListItem("VintaSoft Office .NET Plug-in, Site license for Desktop PCs", "vsoffice-icon.png", 569.95f),
new PriceListItem("VintaSoft PDF .NET Plug-in (Reader+Writer), Site license for Desktop PCs", "vspdf-icon.png", 1499.95f),
new PriceListItem("VintaSoft PDF .NET Plug-in (Reader+Writer+VisualEditor), Site license for Desktop PCs", "vspdf-icon.png",2999.95f),
new PriceListItem("VintaSoft JBIG2 .NET Plug-in, Site license for Desktop PCs", "vsjbig2-icon.png",1139.95f),
new PriceListItem("VintaSoft JPEG2000 .NET Plug-in, Site license for Desktop PCs", "vsjpeg2000-icon.png", 689.95f),
new PriceListItem("VintaSoft Document Cleaup .NET Plug-in, Site license for Desktop PCs", "vsdoccleanup-icon.png", 569.95f),
new PriceListItem("VintaSoft OCR .NET Plug-in, Site license for Desktop PCs", "vsocr-icon.png", 509.95f),
new PriceListItem("VintaSoft DICOM .NET Plug-in (Codec+MPR), Site license for Desktop PCs", "vsdicom-icon.png", 1199.95f),
new PriceListItem("VintaSoft Forms Processing .NET Plug-in, Site license for Desktop PCs", "vsformsprocessing-icon.png", 509.95f),
new PriceListItem("VintaSoft Barcode .NET SDK (1D+2D Reader+Writer), Site license for Desktop PCs", "vsbarcode-icon.png", 1379.95f),
new PriceListItem("VintaSoft Twain .NET SDK, Developer license", "vstwain-icon.png", 179.95f),
new PriceListItem("VintaSoft Twain .NET SDK, Site license", "vstwain-icon.png", 539.95f),
new PriceListItem("VintaSoft Twain .NET SDK, Single URL license", "vstwain-icon.png", 149.95f),
new PriceListItem("VintaSoft Twain ActiveX, Developer license", "vstwain-icon.png", 99.95f),
new PriceListItem("VintaSoft Twain ActiveX, Site license", "vstwain-icon.png", 299.95f),
new PriceListItem("VintaSoft Twain ActiveX, Single URL license", "vstwain-icon.png", 119.95f)
};
}
/// <summary>
/// Represents a price list item.
/// </summary>
public class PriceListItem
{
/// <summary>
/// Initializes a new instance of the <see cref="PriceListItem"/> class.
/// </summary>
/// <param name="product">The product name.</param>
/// <param name="imageId">Th image ID.</param>
/// <param name="price">The product price.</param>
public PriceListItem(string product, string imageId, float price)
{
Product = product;
ImageId = imageId;
Price = price;
}
/// <summary>
/// Gets the product name.
/// </summary>
public string Product;
/// <summary>
/// Gets the image Id.
/// </summary>
public string ImageId;
/// <summary>
/// Gets the product price.
/// </summary>
public float Price;
}