有点难度的Excel导入问题, 请教高手!!! (在线等)

时间:2022-02-15 09:19:57
有如下格式的Excel(以前的老文档, 需要导入到数据库中管理)

 A          B              C       D          E     
          产品代号       11111     产品组   XXXX    
          产品名称       XXXXX
(空行)

         编号
序号   物料编号 老编号   名称     图号     .......   (二行, 有合并单无格)
1-001  001       1       XXXX     XXX       XXXX
1-002  002       2       XXXX     XXX       XXX     
.....

请问这样的 Excel 文档怎么 将其导入数据库的 两张有主从关系的表中
分别: 产品表, 产品物料表


给出思路也行!

先谢谢各位大侠了!


25 个解决方案

#1


没做过,提一下操作思路吧

使用Ole连接对象(就像Acces那样)可以直接吧Excel当主数据库来读的,每个Sheet的名字都相当于表名

你获取到连接以后放在两个DataTable里面。由于DataSet容纳多个DataTable的时候可以连关系,所以应该就可以将主从表绑定在一起了(不过应该需要数据绝对干净啊,如果有脏数据,情况恐怕不乐观)

之后就可以把DataSet搞到数据库去了。

另外还有一个思路,可行性不知道如何。使用SQL的DTS包,如果做好了包可以发布成脚本用来操作。没写过,试试看吧!

#2


先将

产品物料表 cut下来放到另一张sheet中.

用dts导到sql server的两张表中,然后在这两张表中进行相应的处理


------说错了莫怪。

#3


连接没问题,

现在是第一个表怎么取数据与数据库表字段对应问题, 是否一个一个定位?

第二张表 要对应 Excel 表中
         编号
序号   物料编号 老编号   名称     图号     .......   (二行, 有合并单无格)
1-001  001       1       XXXX     XXX       XXXX
1-002  002       2       XXXX     XXX       XXX     
.....

这些行, 

Cut 有什么好方法,

因为文件多, 不可能每张表手工操作的.


#4


导到数据库是用一个新表,他会自己建个新表,不要有现有的。
这个新表只是个临时表,用完后删除的。


合并单格的,先全部取消合并,保证列在第一行就可。


------说错了莫怪。

#5


还有个问题:

我在使用 Oledb 将Excel 导入到DataTable 时,

数字是文字格式或前面有 "'" 号的单元不能导入.
即在 Excel 单元格的 左上角显示 小三角符号的

请问那位兄弟有解决方法?

谢了!

#6


前段时间也碰到类似的.

 这个只能先用OleDB读取Excel中的内容,再进行筛选.
 
  Excel数据大致分为几块,建议通过配置确定每块的位置,方便读取.

  ","问题可替换掉.

#7


/// <summary>
        /// 获取指定块(区域)的数据.
        /// </summary>
        /// <param name="dsSource">来自Excel中的记录信息.</param>
        /// <param name="markSign">区域块左上角第一单元格内容.</param>
        /// <param name="rowsCount">区域块的行数(未知则传0).</param>
        /// <param name="columnsCount">区域块的列数.</param>
        /// <param name="msg">返回错误消息(如果存在).</param>
        /// <returns>DataSet:改数据块的所包含的数据内容.</returns>
        protected DataSet GetSpecifyData(DataSet dsSource, string markSign, int rowsCount, int columnsCount)
        {
            DataSet dsN = new DataSet();
            DataTable dtN;
            if (dsSource != null && dsSource.Tables.Count > 0)
            {
                //遍历Excel中所有的表
                foreach (DataTable dt in dsSource.Tables)
                {
                    dtN = new DataTable(dt.TableName);
                    DataRow row = null;
                    bool bl = false;
                    bool IsErow = true;
                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        if (rowsCount == 0)
                        {
                            IsErow = false;
                        }
                        if (dtN.Rows.Count < rowsCount || IsErow == false)
                        {
                            row = dtN.NewRow();
                            for (int k = 0; k < dt.Columns.Count; k++)
                            {
                                //找到区域块左上角标识.
                                if (dt.Rows[j][k].ToString().Trim().Equals(markSign) || bl)
                                {
                                    bl = true;
                                    //填充列.
                                    if (!dtN.Columns.Contains(k.ToString()) && dtN.Columns.Count < columnsCount)
                                    {
                                        dtN.Columns.Add(new DataColumn(k.ToString(), typeof(string)));
                                    }
                                    //填充行
                                    if (dtN.Columns.Contains(k.ToString()))
                                    {
                                        row[k.ToString()] = dt.Rows[j][k].ToString();
                                    }
                                }
                            }
                            if (bl)
                            {
                                dtN.Rows.Add(row);
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    if (dtN.Rows.Count == 0)
                    {
                        ErMessage = string.Format(ImportConst.ErrorMessage_NoFound_Column, dt.TableName, markSign);
                    }
                    else
                    {
                        dsN.Tables.Add(dtN);
                    }
                }
            }
            return dsN;
        }
        #endregion

#8


分块读取指定的单元格已完成了,


下面这个问题有没有好的解决方法? 再问:

==============================================

我在使用 Oledb 将Excel 导入到DataTable 时,

数字是文字格式或前面有 "'" 号的单元不能导入.
即在 Excel 单元格的 左上角显示 小三角符号的

请问那位兄弟有解决方法?

#9


请问 Zine_Alone(老鼠都给猫当伴娘了.哎.) 


怎么筛选?
我是通过 Select 语句直接导到 DataTable 中的,
没有做遍历的.

#10


Excel--OledDB--DataSet---遍历(每块的行数,列数)---期望的DataSet.

 另外还有一种办法,但是也需要知道Excel中你要读取的这些数据块的位置(列,行).用Excel.dll去读取,但是那种效率很低下.

#11


to 
  我在使用 Oledb 将Excel 导入到DataTable 时,

数字是文字格式或前面有 "'" 号的单元不能导入.
即在 Excel 单元格的 左上角显示 小三角符号的

请问那位兄弟有解决方法?

   在遍历(每块的行数,列数)---期望的DataSet 中 Replace掉,我也没找到什么好办法

#12



to: Zine_Alone(老鼠都给猫当伴娘了.哎.) 

1. 实际在我的 Excel 文档上 有小三角符号 的单元格并没有看见前面的 "'", 但有 小三角符号, Office 2003 也提示 可能是 文字格式的数字. 

2. 这样的单元格导出时 有些为空, 有些又是OK的


#13


mark

#14


帮你顶~

#15


再请问:

我使用 Oledb 读 Excel 表到 DataTable时,总是把 文字当作数字, 
如: 123253, 得出 123253.0 什么的, 

请问:
怎么设置在使用 OleDb读 Excel 表到 DataTable 时让所有列格式都是 字符串 类型.

急!
先谢过!

#16


帮你顶~

#17


还没结果, 那位大哥帮助!!

#18


1.Excel中的格式该成文本
2.将这一列的内容前再excel里加' 或者Oledb的方法

Standard:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""


"HDR=Yes;" indicates that the first row contains columnnames, not data
"IMEX=1;" tells the driver to always read "intermixed" data columns as text


TIP! SQL syntax: "SELECT * FROM [sheet1$]" - i.e. worksheet name followed by a "$" and wrapped in "[" "]" brackets.

#19


ooo

#20


倒数据是最烦的事情了,我以前用的是VBA处理,效率不能说是高,但是还是很方便的。

帮顶

#21


2.0新增一个类SqlBulkCopy。
SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

具体操作,请查msdn

#22


另:有关'号的问题,你可以在使用sql语句生成dataset的时候,直接用sql语句将其替换掉

#23


试用使用XML
另存为XML,然后打开看看里面的XML格式,或许对你你帮助
:)我经常就是这么解决问题的,这样做经常很快就有思路了

#24


谢谢各位的解答!

我的情况是:
原来的一些老的 BOM 报表,
现在要用公司上BOM系统, 将原来的这些BOM数据导入到 数据库中,

BOM报表的格式通常是:

BOM名称 XXX              BOM编号  XXXX
    BOM日期 XXXX      版本号 XXXX       ....
//下面是物料的列表
  A物料  (编号)09929838282  50  个 ...
  ...

我的处理是: 将一张 BOM 报表导入到 两个主从关系的数据表中(BOM表, BOMDetail表).
有两个问题:
1). BOM表中的数据需要从Excel报表的不同段中提取, 
    BOM名称数据 可能位于 第2列3行, BOM编号 可能位于 第3列4行, 
    ...
2). 物料的列表导入到 BOMDetail表
    我使用 OleDb 导取这一部分的数据时, 碰到有些数据为空, 但 Excel 上明明有数据, 
    
    该单元格上有"小三角符号", 但并没有看见前面的 "'", Office 2003 也提示 可能是 文字格式的数字.

第一个问题我使用 定位查找 已解决.
但第二个问题还没有答案.

也请教各位.



#25


看来只好结贴了!

#1


没做过,提一下操作思路吧

使用Ole连接对象(就像Acces那样)可以直接吧Excel当主数据库来读的,每个Sheet的名字都相当于表名

你获取到连接以后放在两个DataTable里面。由于DataSet容纳多个DataTable的时候可以连关系,所以应该就可以将主从表绑定在一起了(不过应该需要数据绝对干净啊,如果有脏数据,情况恐怕不乐观)

之后就可以把DataSet搞到数据库去了。

另外还有一个思路,可行性不知道如何。使用SQL的DTS包,如果做好了包可以发布成脚本用来操作。没写过,试试看吧!

#2


先将

产品物料表 cut下来放到另一张sheet中.

用dts导到sql server的两张表中,然后在这两张表中进行相应的处理


------说错了莫怪。

#3


连接没问题,

现在是第一个表怎么取数据与数据库表字段对应问题, 是否一个一个定位?

第二张表 要对应 Excel 表中
         编号
序号   物料编号 老编号   名称     图号     .......   (二行, 有合并单无格)
1-001  001       1       XXXX     XXX       XXXX
1-002  002       2       XXXX     XXX       XXX     
.....

这些行, 

Cut 有什么好方法,

因为文件多, 不可能每张表手工操作的.


#4


导到数据库是用一个新表,他会自己建个新表,不要有现有的。
这个新表只是个临时表,用完后删除的。


合并单格的,先全部取消合并,保证列在第一行就可。


------说错了莫怪。

#5


还有个问题:

我在使用 Oledb 将Excel 导入到DataTable 时,

数字是文字格式或前面有 "'" 号的单元不能导入.
即在 Excel 单元格的 左上角显示 小三角符号的

请问那位兄弟有解决方法?

谢了!

#6


前段时间也碰到类似的.

 这个只能先用OleDB读取Excel中的内容,再进行筛选.
 
  Excel数据大致分为几块,建议通过配置确定每块的位置,方便读取.

  ","问题可替换掉.

#7


/// <summary>
        /// 获取指定块(区域)的数据.
        /// </summary>
        /// <param name="dsSource">来自Excel中的记录信息.</param>
        /// <param name="markSign">区域块左上角第一单元格内容.</param>
        /// <param name="rowsCount">区域块的行数(未知则传0).</param>
        /// <param name="columnsCount">区域块的列数.</param>
        /// <param name="msg">返回错误消息(如果存在).</param>
        /// <returns>DataSet:改数据块的所包含的数据内容.</returns>
        protected DataSet GetSpecifyData(DataSet dsSource, string markSign, int rowsCount, int columnsCount)
        {
            DataSet dsN = new DataSet();
            DataTable dtN;
            if (dsSource != null && dsSource.Tables.Count > 0)
            {
                //遍历Excel中所有的表
                foreach (DataTable dt in dsSource.Tables)
                {
                    dtN = new DataTable(dt.TableName);
                    DataRow row = null;
                    bool bl = false;
                    bool IsErow = true;
                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        if (rowsCount == 0)
                        {
                            IsErow = false;
                        }
                        if (dtN.Rows.Count < rowsCount || IsErow == false)
                        {
                            row = dtN.NewRow();
                            for (int k = 0; k < dt.Columns.Count; k++)
                            {
                                //找到区域块左上角标识.
                                if (dt.Rows[j][k].ToString().Trim().Equals(markSign) || bl)
                                {
                                    bl = true;
                                    //填充列.
                                    if (!dtN.Columns.Contains(k.ToString()) && dtN.Columns.Count < columnsCount)
                                    {
                                        dtN.Columns.Add(new DataColumn(k.ToString(), typeof(string)));
                                    }
                                    //填充行
                                    if (dtN.Columns.Contains(k.ToString()))
                                    {
                                        row[k.ToString()] = dt.Rows[j][k].ToString();
                                    }
                                }
                            }
                            if (bl)
                            {
                                dtN.Rows.Add(row);
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    if (dtN.Rows.Count == 0)
                    {
                        ErMessage = string.Format(ImportConst.ErrorMessage_NoFound_Column, dt.TableName, markSign);
                    }
                    else
                    {
                        dsN.Tables.Add(dtN);
                    }
                }
            }
            return dsN;
        }
        #endregion

#8


分块读取指定的单元格已完成了,


下面这个问题有没有好的解决方法? 再问:

==============================================

我在使用 Oledb 将Excel 导入到DataTable 时,

数字是文字格式或前面有 "'" 号的单元不能导入.
即在 Excel 单元格的 左上角显示 小三角符号的

请问那位兄弟有解决方法?

#9


请问 Zine_Alone(老鼠都给猫当伴娘了.哎.) 


怎么筛选?
我是通过 Select 语句直接导到 DataTable 中的,
没有做遍历的.

#10


Excel--OledDB--DataSet---遍历(每块的行数,列数)---期望的DataSet.

 另外还有一种办法,但是也需要知道Excel中你要读取的这些数据块的位置(列,行).用Excel.dll去读取,但是那种效率很低下.

#11


to 
  我在使用 Oledb 将Excel 导入到DataTable 时,

数字是文字格式或前面有 "'" 号的单元不能导入.
即在 Excel 单元格的 左上角显示 小三角符号的

请问那位兄弟有解决方法?

   在遍历(每块的行数,列数)---期望的DataSet 中 Replace掉,我也没找到什么好办法

#12



to: Zine_Alone(老鼠都给猫当伴娘了.哎.) 

1. 实际在我的 Excel 文档上 有小三角符号 的单元格并没有看见前面的 "'", 但有 小三角符号, Office 2003 也提示 可能是 文字格式的数字. 

2. 这样的单元格导出时 有些为空, 有些又是OK的


#13


mark

#14


帮你顶~

#15


再请问:

我使用 Oledb 读 Excel 表到 DataTable时,总是把 文字当作数字, 
如: 123253, 得出 123253.0 什么的, 

请问:
怎么设置在使用 OleDb读 Excel 表到 DataTable 时让所有列格式都是 字符串 类型.

急!
先谢过!

#16


帮你顶~

#17


还没结果, 那位大哥帮助!!

#18


1.Excel中的格式该成文本
2.将这一列的内容前再excel里加' 或者Oledb的方法

Standard:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""


"HDR=Yes;" indicates that the first row contains columnnames, not data
"IMEX=1;" tells the driver to always read "intermixed" data columns as text


TIP! SQL syntax: "SELECT * FROM [sheet1$]" - i.e. worksheet name followed by a "$" and wrapped in "[" "]" brackets.

#19


ooo

#20


倒数据是最烦的事情了,我以前用的是VBA处理,效率不能说是高,但是还是很方便的。

帮顶

#21


2.0新增一个类SqlBulkCopy。
SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

具体操作,请查msdn

#22


另:有关'号的问题,你可以在使用sql语句生成dataset的时候,直接用sql语句将其替换掉

#23


试用使用XML
另存为XML,然后打开看看里面的XML格式,或许对你你帮助
:)我经常就是这么解决问题的,这样做经常很快就有思路了

#24


谢谢各位的解答!

我的情况是:
原来的一些老的 BOM 报表,
现在要用公司上BOM系统, 将原来的这些BOM数据导入到 数据库中,

BOM报表的格式通常是:

BOM名称 XXX              BOM编号  XXXX
    BOM日期 XXXX      版本号 XXXX       ....
//下面是物料的列表
  A物料  (编号)09929838282  50  个 ...
  ...

我的处理是: 将一张 BOM 报表导入到 两个主从关系的数据表中(BOM表, BOMDetail表).
有两个问题:
1). BOM表中的数据需要从Excel报表的不同段中提取, 
    BOM名称数据 可能位于 第2列3行, BOM编号 可能位于 第3列4行, 
    ...
2). 物料的列表导入到 BOMDetail表
    我使用 OleDb 导取这一部分的数据时, 碰到有些数据为空, 但 Excel 上明明有数据, 
    
    该单元格上有"小三角符号", 但并没有看见前面的 "'", Office 2003 也提示 可能是 文字格式的数字.

第一个问题我使用 定位查找 已解决.
但第二个问题还没有答案.

也请教各位.



#25


看来只好结贴了!