找回密码
 立即注册

QQ登录

只需一步,快速开始

TsingJames

中级会员

14

主题

45

帖子

770

积分

中级会员

积分
770
TsingJames
中级会员   /  发表于:2019-6-13 12:34  /   查看:3723  /  回复:7
需求:       在设置某一列允许编辑,其他列不允许编辑的情况下,从Excel导入数据并显示,不导入列名<Excel第一列>,直接使用C1FlexGrid列标题(标题格式样式保持不变)。

问题:
       在C1FlexGrid任务中设置了每列列标题,设置其中一列(如:数量 列)允许编辑,其他列不允许编辑,此时AutoGenerateColumns=True(默认),C1Flex Grid是手动绑定数据源的,程序运行后,发现所有列都可以修改,此时要把AutoGenerateColumns属性设置为False就可以了。

       但从Excel表格导入数据,发现只显示行(数),不显示每列(单元格)列值,都是为空。经测试发现把AutoGenerateColumns属性设置为True,就能正常显示数据,此时会引发上面的问题,所有列都允许编辑了,且C1FlexGrid列标题改变了。
       怎么处理使其都能满足?
  1. Private Sub ImportButton_Click(sender As Object, e As EventArgs) Handles ImportButton.Click

  2.         Dim opd As OpenFileDialog = New OpenFileDialog()
  3.         opd.Filter = "Excel(*.xls,*.xlsx)|*.xls;*.xlsx"

  4.         If opd.ShowDialog = DialogResult.OK Then
复制代码
AutoGenerateColumns=False导入结果
AutoGenerateColumns=True导入结果


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

7 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-14 00:03:50
沙发
本帖最后由 Richard.Ma 于 2019-6-14 00:06 编辑

你是如何不导入列名<Excel第一列>,只导入从第二行开始的值的,还是excel本身不包含列头
麻烦将详细的代码上传上来,我帮你分析一下

回复 使用道具 举报
TsingJames
中级会员   /  发表于:2019-6-14 09:32:27
板凳
Richard.Ma 发表于 2019-6-14 00:03
你是如何不导入列名,只导入从第二行开始的值的,还是excel本身不包含列头
麻烦将详细的代码上传上来,我 ...

Public Class ExcelHelper
    Public Shared Function ExcelToC1FlexGrid(ByVal path As String) As DataTable
        Try
            Dim workbook As Workbook = New Workbook()
            workbook.LoadFromFile(path)
            Dim worksheet As Worksheet = workbook.Worksheets(0)
            Return SheetToDataTable(worksheet)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return Nothing
    End Function


    Private Shared Function SheetToDataTable(ByVal sheet As Worksheet) As DataTable
        Dim iRowCount As Integer = sheet.Rows.Length
        Dim iColCount As Integer = sheet.Columns.Length
        Dim dt As DataTable = New DataTable()

        '添加列名,不加后面的dr会报错
        For i = 0 To iColCount - 1
            Dim name As String = "column" & i
            dt.Columns.Add(New DataColumn(name, GetType(String)))
        Next
        '从Excel第2行开始
        For iRow = 2 To iRowCount
            Dim dr As DataRow = dt.NewRow()
            For iCol = 1 To iColCount
                dr(iCol - 1) = sheet.Range(iRow, iCol).Text
            Next

            dt.Rows.Add(dr)
        Next

        Return dt
    End Function
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-14 11:03:05
地板
本帖最后由 Richard.Ma 于 2019-6-14 11:05 编辑

好吧,我一直以为你用的就是FLEXGRID本身自带的excel导入功能

你这样其实就是导入了一个列名为column+i 的table,最后和你创建的flexgrid的
1.有已经创建的列名,列名对不上,肯定就是数据空白,
1.没有列名,自动生成了table中的column+i 列名

如果要实现你说的情况,给table中定义列名定义为你想要的就可以了吧



回复 使用道具 举报
TsingJames
中级会员   /  发表于:2019-6-14 14:28:01
6#
Richard.Ma 发表于 2019-6-14 11:03
好吧,我一直以为你用的就是FLEXGRID本身自带的excel导入功能

你这样其实就是导入了一个列名为column+i  ...

开始我是用自带的导入导出功能,但存在一个问题就是导出时会带上0列,这个是我不需要的列,我要的是带列名一起导出;在导入的时候虽Excel表格有列名,但导入不要带,从2行开始。这个解决了,我就不再在用其他控件或多写代码了。
那我把table也定义和FlexGrid一样,反正都是按照模板(先导出编辑修改再导入)形式导入的。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-14 15:12:25
7#
本帖最后由 Richard.Ma 于 2019-6-14 15:14 编辑

还是不太明白你描述的意思,现你在把table定义成带你需要的列名的应该可以解决你的问题吧,如果还有问题的话,可以把电话私信给我,我给你打个电话沟通吧
回复 使用道具 举报
TsingJames
中级会员   /  发表于:2019-6-17 14:33:13
8#
Richard.Ma 发表于 2019-6-14 15:12
还是不太明白你描述的意思,现你在把table定义成带你需要的列名的应该可以解决你的问题吧,如果还有问题的 ...

table定义列名可以,但又要重新设置列名格式,不然给用户感觉列名在变化;能否提供下C1FlexGrid导出不带0列,但带列名的demo,我开始也用自身的导出功能,要么都带0列和列名,要么都不带,如果C1FlexGrid自身就可以,我就不用绕圈子了。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-17 18:13:25
9#
如果要实现你的这种需求的话,用table来做中转来导入是一个很好的方式。目前看来没有其他更好的放肆了,
系统自带的接口适合于全部导入带列名的excel。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部