将excel工作表转换为sql脚本
Posted
技术标签:
【中文标题】将excel工作表转换为sql脚本【英文标题】:convert excel worksheet to sql script 【发布时间】:2012-10-25 11:14:53 【问题描述】:我有一个 Excel 工作表 (.xls)。我需要将其转换为 sql 脚本。单个 Excel 工作表由多个表格组成。所以生成的脚本应该有多个创建表和插入语句。 我尝试了各种工具,例如http://www.sqlconverter.com/,但我无法找到合适的解决方案。还有什么办法可以吗?
【问题讨论】:
AFAIK MS SQL Server 提供了一些将 excel 表加载到数据库中的功能:support.microsoft.com/kb/321686 我之前看过这个链接,但它非常复杂,我无法通过它.. 我需要一个简单的解决方案 【参考方案1】:我注意到您的评论是,使用导入向导的解决方案比您想要的要复杂,因此您必须尝试加载数据。
你可以试试BULK INSERT
:
首先,在每张纸上执行另存为并将它们转换为 CSV 文件。对于要导入的每张工作表,您都应该有一个 CSV 文件。
接下来,制作一个与您将要引入的数据类型和长度相似的表格。典型的 Excel 单元格是 VARCHAR(255),(如果您想具体一点,可能更像 NVARCHAR(255),但是我们将在此解决方案中避免使用 unicode)。
所以,如果您的 excel 表格有 5 列:
CREATE TABLE Sheet1
(Column1 VARCHAR(255)
, Column2 VARCHAR(255)
, Column3 VARCHAR(255)
, Column4 VARCHAR(255)
, Column5 VARCHAR(255)
)
然后您可以向表中写入一个简单的批量插入,前提是您在网络共享或本地有 SQL 实例所在的服务器/机器上的文件。例如,如果您的机器上有文件并想尝试将文件推送到网络上的服务器,SQL 会认为下面脚本中的 C:\
位于服务器上,而不是您的机器上。您必须共享一个文件夹并通过网络访问它:\\MyMachineName\SharedFolder\Sheet1.csv
BULK INSERT dbo.Sheet1
FROM 'C:\LocalFolder\WhereTheFileIs\Sheet1.csv'
WITH (
FIELDTERMINATOR = ','
, ROWTERMINATOR = '\n'
)
如果文件和表中存在相同数量的列,这应该会将数据放入该表中。
它不漂亮,但很简单。 BULK INSERT
是一种行之有效的基本快速加载方法。
【讨论】:
【参考方案2】:还有一种简单的方法可以从 Excell 中对插入进行分组:只要您的数据位于单独列的 B、C 和 D 列中,就可以创建公式: ="插入值('" &B1 &"','" & C1 & "','"&D1&"')
【讨论】:
【参考方案3】:这是由 vamsi krishna mysore 创建的 1.apache apoi应该使用它应该添加到文件和系统中 我在这个项目中使用了 apache apoi
package excelread;
import java.io.File;
import java.io.FileOutputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
public class ExcelRead
public static void main(String[] args) throws Exception
try
FileOutputStream output=new FileOutputStream("result.docx");
FileOutputStream output=new FileOutputStream("result.sql");//sql script in the script
FileOutputStream output=new FileOutputStream("result.xlxs");
FileOutputStream output=new FileOutputStream("result.csv");
XWPFDocument doc=new XWPFDocument();
XWPFParagraph para=doc.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);
XWPFRun pararun=para.createRun();
pararun.setBold(true);
pararun.setFontSize(20);
pararun.setText("Database Tables\n\n");
File f= new File("C:\\Users\\admin\\Desktop\\BUILDING_TB.xls");//file location where it is stored in the system
Workbook wb= Workbook.getWorkbook(f);
int sheets=wb.getNumberOfSheets();
for(int s1=0;s1<sheets;s1++)
System.out.println("for sheet"+s1);
Sheet s= wb.getSheet(s1);
String tbname=s.getName();
XWPFParagraph para1=doc.createParagraph();
para1.setAlignment(ParagraphAlignment.LEFT);
pararun=para1.createRun();
pararun.setText(tbname);
pararun.setFontSize(16);
pararun.setUnderline(UnderlinePatterns.WORDS);
int rows=s.getRows();
int cols=s.getColumns();
int indexrows=0;
int cols1=0;
int indexcols=0;
int pk=1000,dt=1000,cn=1000,ci=1000,dd=1000,n=1000,com=1000;
int ava=0;
List <String> comments= new LinkedList <String>();
List <String> sequence= new LinkedList <String>();
List <String> cid= new LinkedList <String>();
String createQuery="create table " +tbname+"(";
System.out.println(rows+" "+cols);
for(int j=0;j<rows;j++) //TO AVOID EMPTY ROW AND COLUMNS
sequence.clear();
for(int i=0;i<cols;i++) //TO GET ONE ROW DETAILS
indexcols=0;
cols1=0;
Cell c=s.getCell(i,j);
sequence.add(c.getContents());
for(int i=0;i<cols;i++)
if(sequence.get(i)=="")
cols1= ++indexcols;
else
ava=1;
indexrows=j;
break;
if(ava==1)
break;
for(;indexcols<cols;indexcols++) //TO ARRANG DATA IN REQUIRED ORDER
if(sequence.get(indexcols).toLowerCase().contains("PK".toLowerCase()))
pk=indexcols;
else if(sequence.get(indexcols).toLowerCase().contains("Column_id".toLowerCase()))
ci=indexcols;
else if(sequence.get(indexcols).toLowerCase().contains("Column_Name".toLowerCase()))
cn=indexcols;
else if(sequence.get(indexcols).toLowerCase().contains("nullable".toLowerCase()))
n=indexcols;
else if(sequence.get(indexcols).toLowerCase().contains("Data_TYpe".toLowerCase()))
dt=indexcols;
else if(sequence.get(indexcols).toLowerCase().contains("Default".toLowerCase()))
dd=indexcols;
else if(sequence.get(indexcols).toLowerCase().contains("comments".toLowerCase()))
com=indexcols;
indexrows++;
int rows1=indexrows;
for(;indexrows<rows;indexrows++) //PREPARING QUERY(For excel rows which contain data)
indexcols=cols1;
for(;indexcols<cols;indexcols++) //for all columns
Cell c=s.getCell(indexcols, indexrows);
String item=c.getContents();
//adding Column name to query
if(indexcols==cn)
if(!(item.equals("")) && indexrows!=rows1)
createQuery =createQuery+" ,"+item;
else if(item.equals(""))
break;
else
createQuery =createQuery+" "+item;
//adding data type to query
if(indexcols==dt)
createQuery =createQuery+" "+item;
//adding data default to query
else if(indexcols==dd)
if(item=="")
continue;
else
createQuery =createQuery+" "+"default "+item;
//addig primary key constaint to query
else if(indexcols==pk)
if(item.equalsIgnoreCase("true"))
createQuery =createQuery+" "+"primary key";
else
createQuery =createQuery+" "+"";
//adding not null constraint to query
else if(indexcols==n)
if(item.equalsIgnoreCase("no"))
createQuery =createQuery+" "+"not null";
else
createQuery =createQuery+" "+"";
//adding comments
else if(indexcols==com)
if(item!="")
comments.add(item);
else
comments.add("comments empty");
else if(indexcols==ci)
if(item!=null)
cid.add(item);
//column loop close
//row looop close
createQuery=createQuery+")";
System.out.println(createQuery);
XWPFParagraph para2=doc.createParagraph();
para2.setAlignment(ParagraphAlignment.LEFT);
pararun=para2.createRun();
pararun.setFontSize(14);
pararun.setText(createQuery+";");
System.out.println("table created successfully");
//sheets loop closse
doc.write(output); //writing data into ouptu file
output.close();
//try block close
catch(Exception e)
System.out.println(e.toString());
//main close
//class close
【讨论】:
以上是关于将excel工作表转换为sql脚本的主要内容,如果未能解决你的问题,请参考以下文章