【问题标题】:Import Excel Data to Relational Tables at MySQL将 Excel 数据导入 MySQL 的关系表
【发布时间】:2011-06-23 10:38:02
【问题描述】:

我的 MySQL 数据库中有三个表。第一个是城市,第二个是镇,第三个是区。每个城镇都有很多区。我的餐桌详情:

城市:

cityid,城市名称

城镇:

townid、cityid、城镇名称、大陆

地区:

区号、城镇号、区名

我有一个 excel 文件,其中包含 一个 城市的城镇和地区名称。它有三列。

市名、镇名、区名

此 Excel 表中的城市名称始终相同。由于其地区,城镇名称有重复。我的意思是对于城镇的每个地区:城市名称和城镇名称相同,而地区名称通常不同。例如:

市名、镇名、区名

X Y A

X Y B

X K C

X K D

【问题讨论】:

  • 如果您从 Excel 端工作,ADO 怎么样?
  • 你能解释一下吗?我也可以手动对excel文件进​​行一些编辑,一次没有限制。我可以先导入城镇,然后再导入地区并自动更新索引(如何?)也没有限制通过编码软件程序自动执行。只是我应该以最简单快捷的方式做到这一点。谢谢。
  • @george 你到底是什么意思?下面的帖子在不与用户环境交互的情况下尽可能解决所有问题。
  • @Remou 我不知道 ADO 是什么意思以及在哪里编写代码。
  • 我还有一个额外的级别,达到了 4。

标签: mysql excel relational-database


【解决方案1】:

你可以save your Excel sheet as in a CSV file,然后使用LOAD DATA INFILE命令将该文件导入到与Excel工作表相同列的MySQL临时表中,最后将临时表记录拆分为“城市”、“城镇”和“地区”。
一个前提:由于Excel文件中没有“id”字段,我想所有的id都是“auto_increment”字段;此外,“城镇”表的“大陆”字段将始终设置为空白值,因为该字段不存在于您的 Excel 工作表中;最后,我假设所有“名称”字段的最大长度为 255 个字符。
从您的示例数据开始,通过以 CSV 格式导出 Excel 工作表并将(例如)保存到“C:\Temp\excel.csv”文件中,您应该得到如下内容:

"city name","town name","district name"
"X","Y","A"
"X","Y","B"
"X","K","C"
"X","K","D"

要将此文件导入您的 MySQL 数据库,请创建一个具有以下内容的“excel2mysql.sql”文件,以及execute it:

DROP TABLE IF EXISTS excel_table;
CREATE temporary TABLE excel_table (
  city_name VARCHAR(255),
  town_name VARCHAR(255),
  district_name VARCHAR(255)
) DEFAULT CHARSET utf8;

LOAD DATA LOCAL INFILE 'C:/Temp/excel.csv' 
INTO TABLE excel_table 
CHARACTER SET utf8
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES;

DROP TABLE IF EXISTS cities;
CREATE TABLE cities (
  city_id int NOT NULL auto_increment,
  city_name VARCHAR(255),
  primary key (city_id)
) DEFAULT CHARSET utf8;

INSERT INTO cities 
  SELECT distinctrow NULL, city_name 
    FROM excel_table 
   ORDER BY city_name;

DROP TABLE IF EXISTS towns;
CREATE TABLE towns (
  town_id int NOT NULL auto_increment,
  city_id int NOT NULL,
  town_name VARCHAR(255),
  continent VARCHAR(255),
  primary key (town_id)
) DEFAULT CHARSET utf8;

INSERT INTO towns 
  SELECT distinctrow NULL, city_id, town_name, '' 
    FROM excel_table, cities 
   WHERE cities.city_name=excel_table.city_name 
   ORDER BY town_name;

DROP TABLE IF EXISTS districts;
CREATE TABLE districts (
  district_id int NOT NULL auto_increment,
  town_id int NOT NULL,
  district_name VARCHAR(255),
  primary key (district_id)
)  DEFAULT CHARSET utf8;

INSERT INTO districts 
  SELECT distinctrow NULL, town_id, district_name 
    FROM excel_table, towns 
   WHERE towns.town_name=excel_table.town_name 
   ORDER BY district_name;

【讨论】:

    【解决方案2】:

    将 MySQL 与 Excel 和 ADO 结合使用的粗略示例。合适的连接字符串可以从http://connectionstrings.com获得

    Dim cn As New ADODB.Connection
    Dim sFile As String, scn As String, sSQL As String
    Dim MySQLConnectionString As String
    
    ''It is probably better to use the name of the workbook
    ''eg C:\Docs\Cities.xls
    sFile = ActiveWorkbook.FullName
    
    ''Access 2003 or less
    scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes"";"
    cn.Open scn
    
    MySQLConnectionString = "ODBC;Driver={MySQL ODBC 5.1 Driver};Server=localhost;" _
    & "Database=mydatabase;User=myuser;Password=mypass;Option=3;"
    
    ''Fields (columns) are case sensitive
    ''Insert cities from sheet1, you can also use a named range, 
    ''include or a range
    sSQL = "INSERT INTO [" & MySQLConnectionString & "].Cities (Id,City) " _
    & "SELECT Id,City FROM [Sheet$] WHERE Id Not In " _
    & "(SELECT Id FROM [" & MySQLConnectionString & "].Cities )"
    
    cn.Execute sSQL, dbFailOnError
    

    【讨论】:

      【解决方案3】:

      如果您的 District、TownCity 名称不是纯 ASCII(带有重音字符),那么您可能需要对 @Enzino 解决方案进行调整或调整;可能只是在任何用户说明中添加一个脚注,以指示用户在将工作表保存到 CSV 文件时,他们需要在 另存为对话框 框中选择:工具->Web Options 选项,选择 Encoding 选项卡,在出现的对话框中设置字符集以匹配相应的 mySQL 表:Unicode (UTF-8 ) 保存前。

      或者,根据谁进行导入,我的以下 answer 可能会帮助他们将数据直接导入 excel_table

      【讨论】:

        猜你喜欢
        • 2013-10-15
        • 1970-01-01
        • 2014-08-14
        • 2015-10-13
        • 2015-09-03
        • 2017-03-29
        • 2012-05-02
        • 2014-04-11
        相关资源
        最近更新 更多