Prerequisites
Please answer the following questions before submitting an issue. YOU MAY DELETE THE PREREQUISITES SECTION.
- What is your product version? 6.9.0
- What is your product type (Angular or MVC)? Angular
- What is product framework type (.net framework or .net core)? Core
If issue related with ABP Framework
- What is ABP Framework version?
If issue is about UI
- Which theme are you using?
- What are the theme settings?
Using the standard generated methods for exporting a grid to Excel, my users are frequently finding when they open the Excel file, it only contains the heading. What might be the cause here and how can I make the full file download consistently?
4 Answer(s)
-
0
Hi schlarmanp, Can you provide relevant code snippets for export?
-
0
Here is the API-side method:
public async Task<FileDto> GetJournalVoucherTransactionsToExcel(GetAllJournalVoucherTransactionsForExcelInput input) { var filteredJournalVoucherTransactions = _journalVoucherTransactionRepository.GetAll() .WhereIf(!string.IsNullOrWhiteSpace(input.Filter), e => false || e.CostpointProjectCode.Contains(input.Filter) || e.CostpointAccountNumber.Contains(input.Filter) || e.AccountAbbreviation.Contains(input.Filter) || e.CostpointOrganizationCode.Contains(input.Filter) || e.TransactionDescription.Contains(input.Filter) || e.TransactionNotes.Contains(input.Filter) || e.CostpointEmployeeNumber.Contains(input.Filter) || e.ProblemCodes.Contains(input.Filter) || e.TransactionState.Contains(input.Filter)) .WhereIf(input.MinLineNumberFilter != null, e => e.LineNumber >= input.MinLineNumberFilter) .WhereIf(input.MaxLineNumberFilter != null, e => e.LineNumber <= input.MaxLineNumberFilter) .WhereIf(!string.IsNullOrWhiteSpace(input.CostpointProjectCodeFilter), e => e.CostpointProjectCode.ToLower() == input.CostpointProjectCodeFilter.ToLower().Trim()) .WhereIf(!string.IsNullOrWhiteSpace(input.CostpointAccountNumberFilter), e => e.CostpointAccountNumber.ToLower() == input.CostpointAccountNumberFilter.ToLower().Trim()) .WhereIf(!string.IsNullOrWhiteSpace(input.AccountAbbreviationFilter), e => e.AccountAbbreviation.ToLower() == input.AccountAbbreviationFilter.ToLower().Trim()) .WhereIf(!string.IsNullOrWhiteSpace(input.CostpointOrganizationCodeFilter), e => e.CostpointOrganizationCode.ToLower() == input.CostpointOrganizationCodeFilter.ToLower().Trim()) .WhereIf(input.MinTransactionAmountUSDFilter != null, e => e.TransactionAmountUSD >= input.MinTransactionAmountUSDFilter) .WhereIf(input.MaxTransactionAmountUSDFilter != null, e => e.TransactionAmountUSD <= input.MaxTransactionAmountUSDFilter) .WhereIf(!string.IsNullOrWhiteSpace(input.TransactionDescriptionFilter), e => e.TransactionDescription.ToLower() == input.TransactionDescriptionFilter.ToLower().Trim()) .WhereIf(!string.IsNullOrWhiteSpace(input.TransactionNotesFilter), e => e.TransactionNotes.ToLower() == input.TransactionNotesFilter.ToLower().Trim()) .WhereIf(!string.IsNullOrWhiteSpace(input.CostpointEmployeeNumberFilter), e => e.CostpointEmployeeNumber.ToLower() == input.CostpointEmployeeNumberFilter.ToLower().Trim()) .WhereIf(input.MinHoursFilter != null, e => e.Hours >= input.MinHoursFilter) .WhereIf(input.MaxHoursFilter != null, e => e.Hours <= input.MaxHoursFilter) .WhereIf(!string.IsNullOrWhiteSpace(input.ProblemCodesFilter), e => e.ProblemCodes.ToLower() == input.ProblemCodesFilter.ToLower().Trim()) .WhereIf(input.MinJournalVoucherIDFilter != null, e => e.JournalVoucherID >= input.MinJournalVoucherIDFilter) .WhereIf(input.MaxJournalVoucherIDFilter != null, e => e.JournalVoucherID <= input.MaxJournalVoucherIDFilter) .WhereIf(!string.IsNullOrWhiteSpace(input.TransactionStateFilter), e => e.TransactionState.ToLower() == input.TransactionStateFilter.ToLower().Trim()); var query = (from o in filteredJournalVoucherTransactions select new GetJournalVoucherTransactionForViewDto() { JournalVoucherTransaction = new JournalVoucherTransactionDto { LineNumber = o.LineNumber, CostpointProjectCode = o.CostpointProjectCode, CostpointAccountNumber = o.CostpointAccountNumber, AccountAbbreviation = o.AccountAbbreviation, CostpointOrganizationCode = o.CostpointOrganizationCode, TransactionAmountUSD = o.TransactionAmountUSD, TransactionDescription = o.TransactionDescription, TransactionNotes = o.TransactionNotes, CostpointEmployeeNumber = o.CostpointEmployeeNumber, Hours = o.Hours, ProblemCodes = o.ProblemCodes, JournalVoucherID = o.JournalVoucherID, TransactionState = o.TransactionState, Id = o.Id } }); var journalVoucherTransactionListDtos = await query.ToListAsync(); return _journalVoucherTransactionsExcelExporter.ExportToFile(journalVoucherTransactionListDtos); }
Here is the angular call:
async exportToExcelTransactions() { //inform user this.notify.info(this.l('Excel file generation initiated...')); //changed this to wait for result instead of using subscribe - //will hopefully solve problem of downloaded files sometimes being empty. var resultFile = await this._journalVoucherTransactionsServiceProxy.getJournalVoucherTransactionsToExcel( this.filterText, this.maxLineNumberFilter == null ? this.maxLineNumberFilterEmpty: this.maxLineNumberFilter, this.minLineNumberFilter == null ? this.minLineNumberFilterEmpty: this.minLineNumberFilter, this.costpointProjectCodeFilter, this.costpointAccountNumberFilter, this.accountAbbreviationFilter, this.costpointOrganizationCodeFilter, this.maxTransactionAmountUSDFilter == null ? this.maxTransactionAmountUSDFilterEmpty: this.maxTransactionAmountUSDFilter, this.minTransactionAmountUSDFilter == null ? this.minTransactionAmountUSDFilterEmpty: this.minTransactionAmountUSDFilter, this.transactionDescriptionFilter, this.transactionNotesFilter, this.costpointEmployeeNumberFilter, this.maxHoursFilter == null ? this.maxHoursFilterEmpty: this.maxHoursFilter, this.minHoursFilter == null ? this.minHoursFilterEmpty: this.minHoursFilter, this.problemCodesFilter, this.journalVoucherIdFilter == null ? this.maxJournalVoucherIDFilterEmpty: this.journalVoucherIdFilter, this.journalVoucherIdFilter == null ? this.minJournalVoucherIDFilterEmpty: this.journalVoucherIdFilter, this.transactionStateFilter ).toPromise(); //wait a couple secs before downloading await this.delay(4000); //4 seconds //inform user this.notify.success(this.l('Excel file download starting...')); //download Excel file this._fileDownloadService.downloadTempFile(resultFile); //return promise to notify caller return new Promise(resolve => { resolve(resultFile); }); }
And this is the HTML:
<button (click)="exportToExcelTransactions()" class="btn btn-outline-success"> <i class="fa fa-file-excel"></i> {{l("ExportToExcel")}} </button>
If the user requests hard refresh of page in Chrome (CTRL + F5), the file downloads completely, otherwise in normal usage, many users are consistently only receiving the header row in the downloaded spreadsheet.
Thoughts?
-
0
HTML:
<button (click)="exportToExcelTransactions()" class="btn btn-outline-success"> <i class="fa fa-file-excel"></i> {{l("ExportToExcel")}} </button>
-
0
Hi,
We had problems with EPPlus and moved to NPOI library in this PR https://github.com/aspnetzero/aspnet-zero-core/pull/3057/files. Could you try this on your version as well ?