lizhuang 2 тижднів тому
коміт
3e8e16e52f
5 змінених файлів з 174 додано та 0 видалено
  1. 10
    0
      .gitignore
  2. BIN
      20250207Qoo10_ItemInfo_20250207125828.xlsx
  3. 35
    0
      README.md
  4. 112
    0
      app.js
  5. 17
    0
      package.json

+ 10
- 0
.gitignore Переглянути файл

@@ -0,0 +1,10 @@
# Node.js
node_modules/
package-lock.json

# Downloaded files
goods/

# Temp files
.DS_Store
Thumbs.db

BIN
20250207Qoo10_ItemInfo_20250207125828.xlsx Переглянути файл


+ 35
- 0
README.md Переглянути файл

@@ -0,0 +1,35 @@
# Q10 商品导出工具

这个工具用于从Excel文件中导出商品图片,并按照指定的目录结构存储。

## 使用方法

1. 在程序所在目录放置Excel文件(`.xlsx`格式)
2. 运行程序:
```
npm start
```
3. 程序将处理Excel文件,并将图片下载到`goods`目录中

## Excel文件格式要求

- B列:商品文件夹名称
- R列:主图片URL
- S列:详情图片URL(多张图片使用`$$`分隔)

## 目录结构

程序会创建以下目录结构:
```
goods/
├── 商品名称1/
│ ├── 主图片.jpg
│ └── details/
│ ├── 详情图片1.jpg
│ └── 详情图片2.jpg
└── 商品名称2/
├── 主图片.jpg
└── details/
├── 详情图片1.jpg
└── 详情图片2.jpg
```

+ 112
- 0
app.js Переглянути файл

@@ -0,0 +1,112 @@
const XLSX = require('xlsx');
const axios = require('axios');
const path = require('path');
const url = require('url');
const fs = require('fs').promises;
const { existsSync, mkdirSync } = require('fs');

// 获取文件名从URL
function getFilenameFromUrl(urlString) {
try {
const parsed = new URL(urlString);
let filename = path.basename(parsed.pathname);
// 如果文件名为空或无效,生成时间戳文件名
if (!filename || !filename.includes('.')) {
const timestamp = Date.now();
filename = `image_${timestamp}.jpg`;
}
return filename;
} catch (error) {
console.error(`Error parsing URL ${urlString}: ${error.message}`);
const timestamp = Date.now();
return `image_${timestamp}.jpg`;
}
}

// 下载图片
async function downloadImage(imageUrl, outputPath) {
try {
const response = await axios({
method: 'GET',
url: imageUrl,
responseType: 'arraybuffer'
});
await fs.writeFile(outputPath, response.data);
console.log(`Downloaded: ${outputPath}`);
} catch (error) {
console.error(`Error downloading image ${imageUrl}: ${error.message}`);
}
}

// 处理Excel文件
async function processExcel() {
try {
// 获取当前目录下的第一个xlsx文件
const files = await fs.readdir('.');
const xlsxFile = files.find(file => file.endsWith('.xlsx'));
if (!xlsxFile) {
console.log("No xlsx file found in current directory");
return;
}

// 读取Excel文件
const workbook = XLSX.readFile(xlsxFile);
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
// 转换为JSON,跳过前4行
const data = XLSX.utils.sheet_to_json(worksheet, {
header: 1,
range: 4 // 从第5行开始 (0-based index)
});

// 处理每一行
for (const row of data) {
if (!row[1]) continue; // B列为空则跳过

const folderName = row[1].toString().trim();
const imageUrl1 = row[17]; // R列
const imageUrl2 = row[18]; // S列

if (!folderName) continue;

// 创建文件夹
const folderPath = `./goods/${folderName}`;
if (!existsSync(folderPath)) {
mkdirSync(folderPath, { recursive: true });
}

// 创建Details子文件夹
const detailsPath = path.join(folderPath, 'details');
if (!existsSync(detailsPath)) {
mkdirSync(detailsPath, { recursive: true });
}

// 下载R列图片
if (imageUrl1) {
const filename1 = getFilenameFromUrl(imageUrl1);
await downloadImage(imageUrl1, path.join(folderPath, filename1));
}

// 下载S列的多个图片
if (imageUrl2) {
const imageUrls = imageUrl2.split('$$').filter(url => url.trim());
for (let i = 0; i < imageUrls.length; i++) {
const imageUrl = imageUrls[i].trim();
if (imageUrl) {
const filename = getFilenameFromUrl(imageUrl);
await downloadImage(imageUrl, path.join(detailsPath, filename));
}
}
}
}

console.log("Processing completed!");

} catch (error) {
console.error(`Error processing Excel file: ${error.message}`);
}
}

// 运行程序
processExcel().catch(console.error);

+ 17
- 0
package.json Переглянути файл

@@ -0,0 +1,17 @@
{
"name": "q10-goods-export",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node app.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"axios": "^1.6.7",
"xlsx": "^0.18.5"
}
}

Завантаження…
Відмінити
Зберегти