Introducción
Hay muchas formas de extraer datos de Acumatica. Por ejemplo, puede crear una consulta genérica o un informe. Casi todos los formularios de Acumatica contienen una cuadrícula y tienen la capacidad de exportar columnas de datos a Excel con sólo hacer clic en el icono disponible en la pantalla de Acumatica. Sin embargo, a menudo los usuarios pueden necesitar una exportación personalizada a Excel directamente desde una pantalla. En este artículo, le mostraré cómo crear un proceso sencillo de exportación personalizada a Excel y le proporcionaré algunos ejemplos de código para empezar.
Considere el siguiente patrón de diseño. En nuestro ejemplo, crearemos un botón en la pantalla de Reclamación de Gastos para exportar cierta información del encabezado y rellenar columnas específicas de la cuadrícula a Excel.
Resultado deseado:
El primer paso es incluir PX.Export como referencia para su proyecto de visual studio de la siguiente manera:
Ahora tendrás que incluir los siguientes espacios de nombre:
public class ExpenseClaimEntry_Extension : PXGraphExtension<ExpenseClaimEntry>
{
#region Event Handlers
#region Button
public PXAction<EPExpenseClaim> exportGridToExcel;
[PXUIField(DisplayName = "Export to Excel", MapEnableRights = PXCacheRights.Select)]
[PXButton(Tooltip = "Export to Excel")]
protected virtual void ExportGridToExcel()
{
EPExpenseClaimDetails details = Base.ExpenseClaimDetails.Current as EPExpenseClaimDetails;
if (details == null) return;
PXLongOperation.StartOperation(Base, delegate ()
{
var excel = new PX.Export.Excel.Core.Package();
var sheet = excel.Workbook.Sheets[1];
string fileNumber = GetUniqueFileNumber();
int headingRow = 1;
int titleRow = 4;
int gridRow = 5;
// Heading Information
sheet.Add(headingRow, 1, "Reference Number:");
sheet.Add(headingRow, 2, Base.ExpenseClaim.Current.RefNbr);
sheet.Add(headingRow + 1, 1, "Description:");
sheet.Add(headingRow + 1, 2, Base.ExpenseClaim.Current.DocDesc ?? string.Empty);
// Create Excel column titles
// adjust column width
sheet.SetColumnWidth(1, 20);
sheet.SetColumnWidth(2, 20);
sheet.SetColumnWidth(3, 40);
sheet.SetColumnWidth(4, 40);
sheet.Add(titleRow, 1, "Expense Date");
sheet.Add(titleRow, 2, "Expense Item");
sheet.Add(titleRow, 3, "Description");
sheet.Add(titleRow, 4, "Claim Amount");
foreach (EPExpenseClaimDetails row in Base.ExpenseClaimDetails.Select())
{
// get inventory CD for display
InventoryItem inventoryItem = PXSelect<InventoryItem,
Where<InventoryItem.inventoryID,
Equal<Required<InventoryItem.inventoryID>>>>.Select(Base, row.InventoryID);
sheet.Add(gridRow, 1, Convert.ToString(row.ExpenseDate));
sheet.Add(gridRow, 2, Convert.ToString(inventoryItem?.InventoryCD ?? string.Empty));
sheet.Add(gridRow, 3, row.TranDesc);
sheet.Add(gridRow, 4, Convert.ToString(row.ClaimCuryTranAmtWithTaxes));
gridRow++;
}
using (MemoryStream stream = new MemoryStream())
{
excel.Write(stream);
string path = String.Format("ExpenseClaimExport-{0}.xlsx", fileNumber);
var info = new PX.SM.FileInfo(path, null, stream.ToArray());
throw new PXRedirectToFileException(info, true);
}
});
}
#endregion
public static string GetUniqueFileNumber()
{
string dTime = DateTime.Now.ToString("yyMMddHHmmssff");
return $"{dTime}";
}
#endregion
El código anterior debería proporcionarle los elementos básicos para ayudarle a diseñar sus propias exportaciones personalizadas. Este método le proporcionará mucha más libertad de diseño y control de los puntos de datos específicos que a usted y a sus clientes les gustaría ver, en lugar de utilizar los escenarios de exportación más limitados.