首页 新闻 会员 周边

Winform 上显示复杂Excel ,希望收悉NOPI的大侠

0
悬赏园豆:100 [待解决问题]


最近在研究在Winform 上显示复杂Excel,通常使用datagrid控件。但次控件只能满足简单表格的显示,遇到一些复杂的就没有什么办法了。听说NOPI很强大,能支持复杂Excel格式的读取,没有接触过NOPI,请教大家给个winform 使用NOPI的例子。下面是我要处理的表格,先将表格在Winform上显示,然后还要导出。 关于解析复杂Excel的通常办法是转化为csv,然后通过逐个判断提取需要的数据。

PS:是winform 程序。

每天在路上的主页 每天在路上 | 初学一级 | 园豆:6
提问于:2014-10-22 17:03
< >
分享
所有回答(9)
0

我想问一下,你是需要一个展示数据的表格控件,还是需要一个用于解析 Excel 文件的组件?

Launcher | 园豆:45045 (高人七级) | 2014-10-22 17:06

我觉得肯定要引入第三方的控件,不然现有的Winform 控件估计满足不了需求的。如果有相关的例子,都可以,应该也会有研究价值的。没有接触过NOPI,所以有点无从下手啊

支持(0) 反对(0) 每天在路上 | 园豆:6 (初学一级) | 2014-10-22 17:09

@每天在路上: 对,你还需要一个表格控件,能实现多重表头,合并单元格等复杂功能。我们假设已经有这样的控件了,那么问题来了,你知道如何从 Excel 文件中读出表格的格式信息吗?比如,有几列?哪些单元格需要合并显示?哪些表头需要合并显示?表头有几级?你没用过 NOPI 没关系,你可以在 Excel 中录制你制作整个表格的操作,得到 VBA 代码,你看看是否那么足够简单?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-10-22 17:14

@Launcher: 如果第三方控件不能识别Excel这些信息的话,那只能自己分析。我目前能想到的方法就是可以把Excel解析为CSV格式,通过分析 这个文本格式以逗号分隔的情况应该能知道这些信息,不过这个过程我也不能把握,里面涉及到一些逻辑问题,不过只要人脑能理清楚,代码就能实现,做过提取过CSV中一些要用的数据,毕竟再复杂的Excel也是有固定格式的,不会变化。

支持(0) 反对(0) 每天在路上 | 园豆:6 (初学一级) | 2014-10-22 17:21

@每天在路上: 那你就以你贴图的表格为例,告诉我你如何得出这个表格的表头有几层,哪些表头需要合并。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-10-22 17:24
0

你的需求是:

打开并显示EXCEL文件?还是编辑数据?还是编辑数据并保存?

如果你没有线性化的数据保存在数据库中的话,我这么理解对吗?

你就是想打开EXCEL,编辑数据、保存数据,这样你就得找一个支持EXCEL的组件即可。

ComponentOne, DevExpress最新版都有类似的控件。

 

NPOI大部份时间是用于数据处理,就是导入EXCEL中的数据。

或者将软件数据库中的数据导出为EXCEL格式。

 

但如果你又想读又想写的,这样的感觉更象是EXCEL编辑,

你要么指出为什么不能用EXCEL打开?

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-10-22 17:23

听你这么分析,我觉得目前侧重点还是处理数据,将EXCEL的数据存到数据库,将数据库导出Excel中,至于界面显示不是很重要,这些功能完可以Excel编辑然后自己获取。

支持(0) 反对(0) 每天在路上 | 园豆:6 (初学一级) | 2014-10-22 17:29

@每天在路上: 这就对了。

你找出事情的重点。

1、有需求从EXCEL读取数据,导入数据库。(这通常都是线性数据,不包括汇总,因为汇总数据库很容易得出),一般要求EXCEL满足一定的规则限制。(判断开始行、结束行等)

2、相应的界面(可能是两至三个提供EXCEL对应数据的编辑及查看功能)

3、数据导出功能。(这个可以利用EXCEL模板,达到如你图中所示的效果)

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-10-22 17:37

@爱编程的大叔: NOPI能在Excel指定范围内取出数据吗?比如我就给一个第一行第一列到第三行第五列的这个范围,输入这个参数就能返回一个类似DataSet之类的值,这样就省去了很多时候将Excel解析为CSV然后逐行去判断这个一个过程,因为如何Excel格式换了一个模板的的话,代码的适应力就比较弱了。

能给个winform中用NOPI的例子吗

支持(0) 反对(0) 每天在路上 | 园豆:6 (初学一级) | 2014-10-22 17:46

@每天在路上: 

1、NPOI读数据类似代码

    Dim myFileStream As FileStream = New FileStream(FileName, FileMode.Open)

        Dim myWorkbook As IWorkbook = New HSSFWorkbook(myFileStream)

        Dim Sheet As ISheet = myWorkbook.GetSheetAt(0) '取第一个表

        Dim headerRow As IRow = Sheet.GetRow(0)         '第一行为标题行

        Dim cellCount As Integer = headerRow.LastCellNum         'LastCellNum = PhysicalNumberOfCells
        Dim rowCount As Integer = Sheet.LastRowNum          '//LastRowNum = PhysicalNumberOfRows - 1

        Dim iImportcount As Long = 0

        Dim iRow As Integer = 0
        Dim iColumnCount As Integer = Me.MainGridView.Columns.Count

        On Error Resume Next

        For i = Sheet.FirstRowNum + 1 To rowCount
            iImportcount += 1

            Dim row As IRow = Sheet.GetRow(i)

            Me.MainGridView.AddNewRow()

            For J = 0 To iColumnCount - 1
                Dim mycolumn As GridColumn = Me.MainGridView.VisibleColumns(J)

                Select Case PropertyHelper.GetUnderlyingType(mycolumn.ColumnType).ToString
                    Case "System.String"
                        MainGridView.SetFocusedRowCellValue(mycolumn, row.Cells(J).StringCellValue)
                    Case "System.DateTime"
                        MainGridView.SetFocusedRowCellValue(mycolumn, row.Cells(J).DateCellValue)
                    Case "System.Decimal"
                        MainGridView.SetFocusedRowCellValue(mycolumn, row.Cells(J).NumericCellValue)

                End Select
            Next

            'iRow += 1

            If iImportcount > 25 Then
                iImportcount = 0
                Application.DoEvents()

                Threading.Thread.Sleep(10)
            End If
        Next

有些代码你不用看,大概就是这么用的。

不需要转为CSV。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-10-22 18:01

@爱编程的大叔:好的,我翻译到winform中试试看看效果。先在这多谢了!

支持(0) 反对(0) 每天在路上 | 园豆:6 (初学一级) | 2014-10-22 18:04

@每天在路上: 中间掺了一点Gridview的代码,也是WINFORM的。

我直接从项目中复制过来,没有再编辑过。

读NPOI的代码是没问题的。

我是读取EXCEL并放入GRIDVIEW.

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-10-22 21:38
0

NPOI 只是用来读取数据用的, 怎么显示 NPOI 是不管的

匡匡 | 园豆:51 (初学一级) | 2014-10-22 17:25
0

研究下owc吧

夕颜 | 园豆:202 (菜鸟二级) | 2014-10-22 21:36
0

只要将excel转成html文件,用浏览器控件显示就可以了

飞林洛克 | 园豆:202 (菜鸟二级) | 2014-10-22 21:36
0

首先,对于显示复杂excel,npoi是没有效的,这个是解析excel用的,和显示没关系。

然后,对于楼主想要实现的显示需求,可以采用在winform中嵌入excel组件实现

幻天芒 | 园豆:37175 (高人七级) | 2014-10-22 23:15
0

NPOI是解析excel处理用的,并不负责显示。

显示EXCEL,可以用SpreadSheetGear或者葡萄城的Spread。

读取数据也很简单,通过行列的下标也能获取值。

如果个人学习用可以搜索下SpreadSheetGear的破解版。

如果需要购买推荐购买葡萄城的Spread,支持多个平台,而且价格便宜,售后也有保证。

xiaocong_soft | 园豆:556 (小虾三级) | 2014-10-23 08:40
0

读取可以用NPOI;要是显示的话,可以找第三方报表

小锅的锅盖 | 园豆:202 (菜鸟二级) | 2014-10-24 10:54
0

如果只是展示的话转成html,调用浏览器控件展示就行了,最简单;

Fred Chen | 园豆:364 (菜鸟二级) | 2014-10-25 09:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册