<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>酒店品牌匹配工具</title>
<!-- 引入XLSX库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.9/xlsx.full.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f9;
margin: 0;
padding: 20px;
color: #333;
}
h1 {
text-align: center;
color: #2c3e50;
}
.container {
max-width: 600px;
margin: 0 auto;
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.upload-section {
margin-bottom: 20px;
}
.upload-section h3 {
margin-bottom: 10px;
color: #3498db;
}
.upload-section button {
background-color: #3498db;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
margin: 5px;
}
.upload-section button:hover {
background-color: #2980b9;
}
.upload-section input {
display: none;
}
.file-info {
margin-top: 10px;
font-size: 14px;
color: #666;
}
.file-info span {
color: #27ae60;
font-weight: bold;
}
.progress-bar {
width: 100%;
background-color: #e0e0e0;
border-radius: 5px;
margin-top: 20px;
overflow: hidden;
}
.progress-bar-inner {
width: 0;
height: 20px;
background-color: #3498db;
transition: width 0.5s ease;
}
.instructions {
text-align: center;
font-size: 14px;
color: #666;
margin-top: 10px;
}
</style>
<script>
let mappingData = null; // 存储映射表数据
let targetData = null; // 存储目标表数据
// 处理上传的映射表
function handleMappingFile(e) {
const file = e.target.files[0];
if (!file) {
alert("请选择一个文件!");
return;
}
const reader = new FileReader();
reader.onload = function (event) {
const data = event.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
const firstSheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[firstSheetName];
const json = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
// 忽略标题行,存储映射数据
mappingData = json.slice(1);
// 显示文件名和上传成功提示
document.getElementById('mappingFileInfo').innerHTML = `
已上传文件:<span>${file.name}</span> - <span>上传成功</span>
`;
};
reader.readAsBinaryString(file);
}
// 处理上传的目标表
function handleTargetFile(e) {
const file = e.target.files[0];
if (!file) {
alert("请选择一个文件!");
return;
}
const reader = new FileReader();
reader.onload = function (event) {
const data = event.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
const firstSheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[firstSheetName];
const json = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
// 忽略标题行,存储目标数据
targetData = json.slice(1);
// 显示文件名和上传成功提示
document.getElementById('targetFileInfo').innerHTML = `
已上传文件:<span>${file.name}</span> - <span>上传成功</span>
`;
};
reader.readAsBinaryString(file);
}
// 开始分析
function startAnalysis() {
if (!mappingData || !targetData) {
alert("请先上传映射表和目标表!");
return;
}
// 模拟进度条
const progressBar = document.getElementById('progress-bar-inner');
let progress = 0;
const interval = setInterval(() => {
progress += 10;
progressBar.style.width = `${progress}%`;
if (progress >= 100) {
clearInterval(interval);
}
}, 300); // 3秒完成
// 遍历目标表的每一行
for (let i = 0; i < targetData.length; i++) {
const hotelName = String(targetData[i][2]); // C列是酒店名称,确保是字符串
// 遍历映射表的每一行
for (let j = 0; j < mappingData.length; j++) {
const brandName = String(mappingData[j][1]); // B列是品牌名,确保是字符串
// 检查目标表的C列是否包含映射表B列的连续品牌名
if (hotelName.includes(brandName)) {
targetData[i][0] = mappingData[j][0]; // A列是集团名
targetData[i][1] = brandName; // B列是品牌名
break; // 匹配成功后跳出循环
}
}
}
alert("分析完成!");
document.getElementById('exportButton').style.display = 'block';
}
// 导出结果
function exportResult() {
if (!targetData) {
alert("请先完成分析!");
return;
}
// 添加标题行
const resultData = [["集团名", "品牌名", "酒店名称"]].concat(targetData);
const newWorkbook = XLSX.utils.book_new();
const newWorksheet = XLSX.utils.aoa_to_sheet(resultData);
XLSX.utils.book_append_sheet(newWorkbook, newWorksheet, "Sheet1");
XLSX.writeFile(newWorkbook, 'processed_hotels.xlsx');
}
</script>
</head>
<body>
<div class="container">
<h1>酒店品牌匹配工具</h1>
<div class="upload-section">
<h3>上传映射表</h3>
<button onclick="document.getElementById('mappingFileInput').click()">上传映射表</button>
<input type="file" id="mappingFileInput" onchange="handleMappingFile(event)" accept=".xlsx,.xls" />
<div id="mappingFileInfo" class="file-info"></div>
<p>映射表格式:A列是集团名,B列是品牌名。</p>
</div>
<div class="upload-section">
<h3>上传目标表</h3>
<button onclick="document.getElementById('targetFileInput').click()">上传目标表</button>
<input type="file" id="targetFileInput" onchange="handleTargetFile(event)" accept=".xlsx,.xls" />
<div id="targetFileInfo" class="file-info"></div>
<p>目标表格式:A、B列为空白,C列是酒店名称。</p>
</div>
<div class="upload-section">
<button onclick="startAnalysis()">开始分析</button>
<button id="exportButton" onclick="exportResult()" style="display: none;">导出结果</button>
</div>
<div class="progress-bar">
<div id="progress-bar-inner" class="progress-bar-inner"></div>
</div>
<div class="instructions">
<p>请先上传映射表,再上传目标表,点击“开始分析”按钮进行匹配。</p>
</div>
</div>
</body>
</html>
HTML
格式化
支持Emmet,输入 p 后按 Tab键试试吧!
<head> ... </head>
<body>
</body>
/* 示例代码 */
body {
text-align: center;
}
i {
color: #777;
}
// 示例代码
console.log(["Hello 笔.COOL 控制台"])