Большой отчет яшмы в Excel вызывает повреждение файла - PullRequest
3 голосов
/ 17 февраля 2010

Я использую jasperreports 3.5.3 для создания большого (но простого) отчета. Только стол со строками.

Когда я перечисляю достаточно большой выбор, сгенерированный файл поврежден. Excel предупреждает пользователя и некоторые данные повреждены. Но если я отфильтрую данные, чтобы показать некоторые строки, в том числе и оскорбительные, они будут сгенерированы нормально.

Есть ли у кого-нибудь опыт использования этого поврежденного файла Excel?

Совет: это происходит на сервере Linux / Apache + JBoss, но тот же код на локальном Windows / Jboss работает нормально. Я не думаю, что апач в середине имеет какое-то дело. Это должно быть что-то в самом поколении.

1 Ответ

2 голосов
/ 22 февраля 2010

Похоже, что jasperreports 3.5.3 может использовать два типа «писателей Excel». По умолчанию экспортером является JRXlsExporter, и он не очень хорошо работает с большими файлами (по крайней мере, в моем проекте Spring MVC).

Обходной путь использует другой экспортер, основанный на JExcelAPI. Я мог бы экспортировать данные без проблем с этим.

Для создания jasperreport используйте JExcelAPI в установке Spring MVC вам нужно написать персонализированный класс. Это очень просто:

import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.export.JExcelApiExporter;

import org.springframework.web.servlet.view.jasperreports.AbstractJasperReportsSingleFormatView;

// this is the view class you'll use, instead of JasperReportsXlsView
public class JasperReportsJExcelApiView extends AbstractJasperReportsSingleFormatView
{
    // copied from JasperReportsXlsView
    public JasperReportsJExcelApiView()
    {
        setContentType("application/vnd.ms-excel");
    }

    protected JRExporter createExporter()
    {
        // we create the JExcelAPIExporter, not the JRXlsExporter
        return new JExcelApiExporter();
    }

    // copied from JasperReportsXlsView (I think it says: write binary data, not text)
    protected boolean useWriter()
    {
        return false;
    }
}

Вам понадобится jxl.jar в вашем пути к классам из дистрибутива JExcelAPI 2.6.

...