如何将Excel文件(XLSX)导入MongoDB

35

我有一组以XLSX格式提供给MongoDB的数据。 我应该如何将Excel文件作为输入导入到MongoDB中?

是否有可用的插件来将xlsx文件作为输入导入到MongoDB中?


1
不可以。但是你可以使用 xlsx 模块(https://www.npmjs.org/package/node-xlsx)来读取 XLSX 文件,然后使用 mongoose 将信息添加到 mongodb 中。此外,在这两个步骤之间需要一个中间代码来“准备”数据。 - alandarev
1
https://github.com/Moblox/mongo-xlsx 为您完成了中间工作。 - eddie
@alandarev:node-xlsx可以读取多个工作表的Excel文件吗? - Loint
7个回答

71

你无法直接将XLSX文件导入MongoDB。但是,你可以将Excel电子表格另存为CSV文件,然后使用mongoimport将其导入MongoDB。你可以在这里找到有关mongoimport的文档。无论如何,你需要运行的命令应该类似于以下内容:

mongoimport --db myDb --collection myCollection --type csv --headerline --file /path/to/myfile.csv
在上面的命令中,--headerline标志表示您的文件的第一行包含字段的名称。根据您的需求,您可以使用许多其他选项。这些在文档中有详细说明。

3

我使用了"fast-csv"将csv文件上传到mongoDB数据库中。

示例代码:

var csv = require("fast-csv");

csv.fromPath('./test.csv',{headers: true})
    .on("data", function(data){
       var details = new Details;
       details=data;
       details.save(function (saveErr, savedetail) {
             if (saveErr) {
                   console.log(saveErr)
             }
        });
    })
    .on("end", function(){
        console.log("done");
    })

2
您可以使用以下代码一次将一个Excel中多个工作表的数据上传到MongoDB中。
第一行即“0”行将被视为列标题,其余数据将作为该列的数据。请点击此处查看示例文件。
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
           DB db = mongoClient.getDB("yourdb_name");
           System.out.println("Connected to Database successfully");
           DBCollection coll = db.getCollection("your_collection name");
           System.out.println("Collection your_collection name selected successfully");

                DBCollection OR = db.getCollection("Input_Container");
                System.out.println("Collection Device_Details selected successfully");
                OR.drop();
                DBObject arg1 = null;
                //coll.update(query, update);
                DBCollection OR_UPLOAD = 
                db.createCollection("Input_Container", arg1);
                String path =" your file path";

                File myFile = new File(path);
                FileInputStream inputStream = new FileInputStream(myFile);
                XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
                int number=workbook.getNumberOfSheets();
                  System.out.println("NumberOfSheets "+number);

                  for(int i=0;i<number;i++)
                  {
                XSSFSheet sheet = workbook.getSheetAt(i);
                int col_value=sheet.getRow(0).getLastCellNum();
                int row_num= sheet.getLastRowNum();
                System.out.println("row_num "+row_num);
                List<String> DBheader = new ArrayList<String>();
                List<String> Data = new ArrayList<String>();

                for(int z=1;z<=row_num;z++){
                     DBheader.clear();
                     Data.clear();
                 for(int j=0;j<col_value;j++)
                {
                    if(sheet.getRow(0).getCell(j).toString()!=null || sheet.getRow(0)!=null)
                    {
                    String cel_value = sheet.getRow(0).getCell(j).toString();
                    DBheader.add(cel_value.trim());
                    }
                    else{
                        break;

                    }
                }
                for(int k=0;k<col_value;k++){
                    String data =" ";   
                    if(sheet.getRow(z).getCell(k)!=null)
                    {
                    data =  sheet.getRow(z).getCell(k).toString();
                    }
                    Data.add(data.trim());

                    }
                BasicDBObject doc = new BasicDBObject();
                System.out.println("Data.size() "+Data.size());

                int l=0;
                for(String headers:DBheader)
                { 
                if(l>Data.size()){break;}
                    doc.append(headers, Data.get(l));
                    l++;
                 }
                OR_UPLOAD.insert(doc);
                }

            }System.out.println("File Upload Done");
                  mongoClient.close();

2

mongoimport -d admin -c Mongocsv --type csv --file Mongocsv.csv --headerline

连接到: 127.0.0.1 成功导入了5个对象

mongo

使用 admin 数据库 切换到 admin 数据库

查询 Mongocsv 集合中的数据:db.Mongocsv.find()


1

有一个pymongo扩展工具包,其中一个模块可以将Excel文件导入到Mongo集合中,或将完整的Excel工作簿导入到Mongo数据库中。

您可以在此处找到文档和示例here
您可以使用`pip install mongoUtils`安装库

  • 您还需要安装xldr库
  • 免责声明:我是这个库的作者

drop_collection=True 会导致程序崩溃,因此如果您不想每次都删除集合但需要更新它,则无法使用该选项。 - kuatroka
@nickmilon - 嘿!我根本无法使mongoUtils(v1.1.8)工作。 我得到:AttributeError:模块“mongoUtils”没有属性“import_workbook”。还有其他人尝试过这个库吗? - Nabakamal Das

1

如果数据库服务器不在本地,您需要指定主机、端口、用户名、密码以及数据库名称和集合名称。

mongoimport --host <hostname>:<port> --username <username> --password <password> --db <db name> --collection <collection name> --type csv --headerline --file /path/to/myfile.csv

0

您可以使用Apache POI库( https://poi.apache.org/)编写Java代码来处理加载Excel文件内容。该库是专门为处理包括Excel在内的MS Office应用程序数据而开发的。

我最近创建了一个基于技术的应用程序,可以帮助您将Excel文件加载到MongoDB数据库中。

该应用程序可在http://www.abespalov.com/获取,并已在Windows上进行测试,但也应适用于Linux。该应用程序会自动创建必要的集合,并使用Excel文件内容填充集合。您可以并行导出多个文件。您可以跳过将文件转换为CSV格式的步骤。该应用程序支持xls和xlsx格式。

总体应用程序阶段如下:

1) 加载Excel文件内容。以下是根据文件扩展名的代码:

fileExtension = FilenameUtils.getExtension(inputSheetFile.getName());

if (fileExtension.equalsIgnoreCase("xlsx")) {
        workbook = createWorkbook(openOPCPackage(inputSheetFile));
} else {
        workbook = createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile));
}

sheet = workbook.getSheetAt(0);

2) 建立MongoDB连接。我使用MongoClientURI库;

MongoClientURI mongoClientURI = new MongoClientURI(
                    "mongodb://" + dbUser + ":" + dbPassword + "@" + dbServer 
+ ":" + dbPort + "/" + dbDatabase);
            excel2db.mongoClient = new MongoClient(mongoClientURI);

3) 遍历该表并将行插入到集合中。这是一段Java代码:

Row row = (Row) rowIterator.next();

    //get column names from a header
    short minColIdx = row.getFirstCellNum();
    short maxColIdx = row.getLastCellNum();

    ArrayList<String> columnNameList = new ArrayList();
    String columnName;

    logger.info("The table {} is being populated", tableName);

    //populate a list of column names
    for (short colIdx = minColIdx; colIdx < maxColIdx; colIdx = (short) (colIdx + 1)) {
        columnNameList.add(row.getCell(colIdx) == null? "": row.getCell(colIdx).toString());
    }

    while (rowIterator.hasNext()) {

        Document document = new Document();
        Row rowData = (Row) rowIterator.next();

        numOfProcessedRows++;
        for (short colIdx = minColIdx; colIdx < maxColIdx; colIdx = (short) (colIdx + 1)) {
            document.put(columnNameList.get(colIdx), rowData.getCell(colIdx).toString());
        }

        //save the document into a collection, point to the database
        MongoCollection mongoCollection = mongoDB.getCollection(tableName);
        mongoCollection.insertOne(document);

    }
}    

在这里,您可以找到为将Excel导出到Postgres而创建的应用程序的所有Java代码(https://github.com/palych-piter/Excel2DB)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接