我想问一下,你是需要一个展示数据的表格控件,还是需要一个用于解析 Excel 文件的组件?
我觉得肯定要引入第三方的控件,不然现有的Winform 控件估计满足不了需求的。如果有相关的例子,都可以,应该也会有研究价值的。没有接触过NOPI,所以有点无从下手啊
@每天在路上: 对,你还需要一个表格控件,能实现多重表头,合并单元格等复杂功能。我们假设已经有这样的控件了,那么问题来了,你知道如何从 Excel 文件中读出表格的格式信息吗?比如,有几列?哪些单元格需要合并显示?哪些表头需要合并显示?表头有几级?你没用过 NOPI 没关系,你可以在 Excel 中录制你制作整个表格的操作,得到 VBA 代码,你看看是否那么足够简单?
@Launcher: 如果第三方控件不能识别Excel这些信息的话,那只能自己分析。我目前能想到的方法就是可以把Excel解析为CSV格式,通过分析 这个文本格式以逗号分隔的情况应该能知道这些信息,不过这个过程我也不能把握,里面涉及到一些逻辑问题,不过只要人脑能理清楚,代码就能实现,做过提取过CSV中一些要用的数据,毕竟再复杂的Excel也是有固定格式的,不会变化。
@每天在路上: 那你就以你贴图的表格为例,告诉我你如何得出这个表格的表头有几层,哪些表头需要合并。
你的需求是:
打开并显示EXCEL文件?还是编辑数据?还是编辑数据并保存?
如果你没有线性化的数据保存在数据库中的话,我这么理解对吗?
你就是想打开EXCEL,编辑数据、保存数据,这样你就得找一个支持EXCEL的组件即可。
ComponentOne, DevExpress最新版都有类似的控件。
NPOI大部份时间是用于数据处理,就是导入EXCEL中的数据。
或者将软件数据库中的数据导出为EXCEL格式。
但如果你又想读又想写的,这样的感觉更象是EXCEL编辑,
你要么指出为什么不能用EXCEL打开?
听你这么分析,我觉得目前侧重点还是处理数据,将EXCEL的数据存到数据库,将数据库导出Excel中,至于界面显示不是很重要,这些功能完可以Excel编辑然后自己获取。
@每天在路上: 这就对了。
你找出事情的重点。
1、有需求从EXCEL读取数据,导入数据库。(这通常都是线性数据,不包括汇总,因为汇总数据库很容易得出),一般要求EXCEL满足一定的规则限制。(判断开始行、结束行等)
2、相应的界面(可能是两至三个提供EXCEL对应数据的编辑及查看功能)
3、数据导出功能。(这个可以利用EXCEL模板,达到如你图中所示的效果)
@爱编程的大叔: NOPI能在Excel指定范围内取出数据吗?比如我就给一个第一行第一列到第三行第五列的这个范围,输入这个参数就能返回一个类似DataSet之类的值,这样就省去了很多时候将Excel解析为CSV然后逐行去判断这个一个过程,因为如何Excel格式换了一个模板的的话,代码的适应力就比较弱了。
能给个winform中用NOPI的例子吗
@每天在路上:
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。
@爱编程的大叔:好的,我翻译到winform中试试看看效果。先在这多谢了!
@每天在路上: 中间掺了一点Gridview的代码,也是WINFORM的。
我直接从项目中复制过来,没有再编辑过。
读NPOI的代码是没问题的。
我是读取EXCEL并放入GRIDVIEW.
NPOI 只是用来读取数据用的, 怎么显示 NPOI 是不管的
研究下owc吧
只要将excel转成html文件,用浏览器控件显示就可以了
首先,对于显示复杂excel,npoi是没有效的,这个是解析excel用的,和显示没关系。
然后,对于楼主想要实现的显示需求,可以采用在winform中嵌入excel组件实现
NPOI是解析excel处理用的,并不负责显示。
显示EXCEL,可以用SpreadSheetGear或者葡萄城的Spread。
读取数据也很简单,通过行列的下标也能获取值。
如果个人学习用可以搜索下SpreadSheetGear的破解版。
如果需要购买推荐购买葡萄城的Spread,支持多个平台,而且价格便宜,售后也有保证。
读取可以用NPOI;要是显示的话,可以找第三方报表
如果只是展示的话转成html,调用浏览器控件展示就行了,最简单;