POI: формат ячейки для записей 2000 и выше поврежден - PullRequest
1 голос
/ 28 октября 2010

Может кто-нибудь помочь мне, как я могу это исправить.

Я использую vb.net 2003 и пытался создать отчет в Excel с использованием POI, но у меня проблема, когда записи превышают 2000, форматы ячеек отсутствуют или повреждены в течение следующих 2000 и выше записей. И когда я открываю сгенерированный отчет, и он показывает сообщение "Для многих различных форматов ячеек" , а следующее сообщение - "Excel обнаружил ошибку и пришлось удалить некоторое форматирование, чтобы избежать повреждения рабочей тетради. Пожалуйста, внимательно проверьте форматирование. "

Может кто-нибудь помочь мне с тем, как это исправить, или у кого-то есть еще идея, чтобы я отформатировал все ячейки, будь то 2000 записей выше.

Код ниже - мой пример кода.

Private Sub btnExtract_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExtract.Click

        Try
            Dim source As String = Application.StartupPath & "\Sample Template.xls"
            Dim sfdialog As New SaveFileDialog

            'Save File
            sfdialog.Filter = "Excel File | *.xls"
            If sfdialog.ShowDialog = DialogResult.OK Then

                'Variable Decleration
                Dim fileIn As java.io.InputStream = New java.io.FileInputStream(source)
                Dim fileOut As java.io.OutputStream = New java.io.FileOutputStream(sfdialog.FileName)
                Dim wb As HSSFWorkbook = New HSSFWorkbook(fileIn)
                Dim sheet As HSSFSheet = wb.getSheet("Sample Template")
                Dim row As HSSFRow
                Dim cell As HSSFCell
                Dim fileName As String = sfdialog.FileName

                'Inputs Data
                For rowNum As Integer = 3 To 10000
                    row = createRowCell(sheet, rowNum)
                    cell = row.getCell(1)
                    cell.setCellValue(rowNum - 2)
                    cell = row.getCell(2)
                    cell.setCellValue("EN" & rowNum - 2)
                    cell = row.getCell(3)
                    cell.setCellValue("TN" & rowNum - 2)
                Next

                fileIn.close()
                wb.write(fileOut)
                fileOut.flush()
                fileOut.close()

                If fileName <> "" Then
                    If MessageBox.Show("Open Generated Excel?", "Open File", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = DialogResult.Yes Then
                        Try
                            Process.Start(fileName)
                        Catch ex As Exception
                            MessageBox.Show("Cannot open file", "Open error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        End Try
                    End If
                End If
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


    End Sub


    Private Function createRowCell(ByRef sheet As HSSFSheet, ByVal rowIndex As Int32) As HSSFRow
        Dim cellIndex As Int32 = 1
        Dim newRow As HSSFRow = sheet.createRow(rowIndex)
        Dim commonStyle As HSSFCellStyle = sheet.getWorkbook().createCellStyle()
        Dim dateStyle As HSSFCellStyle = sheet.getWorkbook().createCellStyle()
        Dim createHelper As HSSFCreationHelper = sheet.getWorkbook().getCreationHelper()
        Dim newCell As HSSFCell

        commonStyle.setBorderBottom(1)
        commonStyle.setBorderTop(1)
        commonStyle.setBorderLeft(1)
        commonStyle.setBorderRight(1)

        newCell = newRow.createCell(cellIndex)
        newCell.setCellStyle(commonStyle)
        cellIndex += 1
        newCell = newRow.createCell(cellIndex)
        newCell.setCellStyle(commonStyle)
        cellIndex += 1
        newCell = newRow.createCell(cellIndex)
        newCell.setCellStyle(commonStyle)


        Return newRow
    End Function

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Вероятно, это не проблема POI. Согласно этой статье Microsoft KB , существует ограничение на количество пользовательских форматов, которые могут быть в одной книге. В статье представлено несколько решений (обходные пути, правда). Надеюсь, вы сможете что-нибудь выяснить.

0 голосов
/ 28 октября 2010

Теперь работает!просто проверьте форматирование, если оно не является избыточным.Как форматирование границ одной ячейки (например, справа, снизу, слева, справа).Хорошо отформатировать только верхнюю и левую границу для каждой ячейки, а затем добавить некоторый формат границы, если он был в конце строки или столбца (например, добавить границу снизу, если она достигает максимальной строки, и добавить границу справа, если она была достигнута).последний столбец ячейки): D

Вот эквивалентный код:

Try
            Dim source As String = Application.StartupPath & "\Sample Template.xls"
            Dim sfdialog As New SaveFileDialog

            'Save File
            sfdialog.Filter = "Excel File | *.xls"
            If sfdialog.ShowDialog = DialogResult.OK Then

                'Variable Decleration
                Dim fileIn As java.io.InputStream = New java.io.FileInputStream(source)
                Dim fileOut As java.io.OutputStream = New java.io.FileOutputStream(sfdialog.FileName)
                Dim wb As HSSFWorkbook = New HSSFWorkbook(fileIn)
                Dim sheet As HSSFSheet = wb.getSheet("Sample Template")
                Dim row As HSSFRow
                Dim cell As HSSFCell

                Dim bgStyle As HSSFCellStyle = wb.createCellStyle
                Dim rightBorder As HSSFCellStyle = wb.createCellStyle
                Dim fileName As String = sfdialog.FileName
                Dim records As Integer = 60000
                'Inputs Data

                bgStyle.setBorderTop(1)
                bgStyle.setBorderLeft(1)
                rightBorder.setBorderTop(1)
                rightBorder.setBorderLeft(1)
                rightBorder.setBorderRight(1)

                For rowNum As Integer = 3 To records
                    row = sheet.createRow(rowNum)

                    If rowNum = records Then bgStyle.setBorderBottom(1)
                    '1
                    cell = row.createCell(1)
                    cell.setCellValue(rowNum - 2)
                    cell.setCellStyle(bgStyle)

                    cell = row.createCell(2)
                    cell.setCellValue("EN" & rowNum - 2)
                    cell.setCellStyle(bgStyle)

                    cell = row.createCell(3)
                    cell.setCellValue("TN" & rowNum - 2)
                    cell.setCellStyle(bgStyle)

                Next

                fileIn.close()
                wb.write(fileOut)
                fileOut.flush()
                fileOut.close()

                If fileName <> "" Then
                    If MessageBox.Show("Open Generated Excel?", "Open File", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = DialogResult.Yes Then
                        Try
                            Process.Start(fileName)
                        Catch ex As Exception
                            MessageBox.Show("Cannot open file", "Open error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        End Try
                    End If
                End If
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
...