首页 / 资讯中心 / 文章详情

CRMEB 集成 PHPExcel:从读取、写入到模板化导出的完整指南

CRMEB 集成 PHPExcel:从读取、写入到模板化导出的完整指南 ★ FEATURED ARTICLE
后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载本篇技术指南以 PHPExcel 官方文档中“Reading and writing to file”章节10-Reading-and-Writing.md为主体结合 CRMEB 开源商城仓库中真实引入的 PHPExcel 源码与 SpreadsheetExcelService 导出封装系统讲解 PHPExcel 读写 Excel 各文件格式的核心 API、Reader/Writer 配置项、内存与性能优化手段以及“读取模板—修改—另存”的实战流程。读者学完后可以在 CRMEB 或任意 PHP 项目中自如实现 xls/xlsx/CSV/ODS 等格式的导入导出并为大文件读取、模板化导出等场景选择正确方案。一、读写能力总览Reader / Writer 与 IOFactory 的关系PHPExcel 的基类只负责内存中的电子表格模型持久化的读取与写入必须依赖两类接口实现PHPExcel_Reader_IReader定义读取器的统一契约只包含canRead($pFilename)与load($pFilename)两个方法见 Reader/IReader.php实现它的有PHPExcel_Reader_Excel2007、PHPExcel_Reader_Excel5、PHPExcel_Reader_CSV等PHPExcel_Writer_IWriter定义写入器的统一契约实现它的有PHPExcel_Writer_Excel2007、PHPExcel_Writer_Excel5、PHPExcel_Writer_CSV等。PHPExcel_IOFactoryIOFactory.php则是创建这两类实例的工厂门面。它的内部维护了一张搜索表$searchLocations通过把{0}占位符替换为传入的类型名如Excel2007动态拼接出PHPExcel_Writer_{0}/PHPExcel_Reader_{0}类名并完成实例化其静态方法createReader()、createWriter()、load()、identify()、createReaderForFile()构成了所有读写操作的入口。在 CRMEB 中PHPExcel 位于crmeb/vendor/phpoffice/phpexcel/包含Classes/源码、Documentation/本文档、Examples/示例与changelog.txt。需要注意PHPExcel 库本身是从 PHPExcel 官方继承的旧代实现2006–2015 版权年代其命名空间风格为PHPExcel_前缀下划线类名与 CRMEB 业务层大量使用的PhpOffice\PhpSpreadsheet新命名空间见下文第七节并不冲突二者在同一项目中可以共存。二、通过 PHPExcel_IOFactory 创建 Reader / Writer2.1 自动识别模式读取文件自动识别模式会让工厂依次探测仓库内各 Reader找到第一个能加载指定文件的读取器并直接完成加载$objPHPExcel PHPExcel_IOFactory::load(05featuredemo.xlsx);load()的实现先调用createReaderForFile()解析出读取器再调用其load()方法源码见 IOFactory.php 的 load 方法。自动识别的典型场景是读取用户上传的报表文件——你事先并不知道上传的是 xls 还是 xlsx。如果还需要在加载前配置读取器属性例如只读数据可以先取得读取器实例再加载$objReader PHPExcel_IOFactory::createReaderForFile(05featuredemo.xlsx); $objReader-setReadDataOnly(true); $objReader-load(05featuredemo.xlsx);2.2 显式指定类型读取文件当你确定文件格式时可以直接指定读取器类型省去探测开销$objReader PHPExcel_IOFactory::createReader(Excel2007); $objPHPExcel $objReader-load(05featuredemo.xlsx);从 IOFactory.php 的实现看createReaderForFile()会先按文件扩展名做“幸运猜测”映射xlsx/xlsm/xltx/xltm→ Excel2007、xls/xlt→ Excel5、ods/ots→ OOCalc、slk→ SYLK、xml→ Excel2003XML、gnumeric→ Gnumeric、htm/html→ HTML而csv被刻意排除原因是 CSV 读取器会“吸入”所有文件随后遍历$autoResolveClasses中的候选类并逐个调用canRead()校验。因此显式模式比自动模式稍快——省去了探测多个读取器的过程。2.3 通过工厂创建 Writer$objWriter PHPExcel_IOFactory::createWriter($objPHPExcel, Excel2007); $objWriter-save(05featuredemo.xlsx);createWriter()与createReader()一样走$searchLocations搜索表动态实例化只是构造时需要传入PHPExcel对象。三、Excel 2007SpreadsheetML / .xlsx格式读写Excel2007 是 PHPExcel 的主打文件格式支持把内存中的电子表格输出为 .xlsx 文件。3.1 读取 .xlsx$objReader new PHPExcel_Reader_Excel2007(); $objPHPExcel $objReader-load(05featuredemo.xlsx);3.2 只读数据忽略样式setReadDataOnly(true)会让读取器跳过样式、数据校验等元信息只读取单元格数值。这在只需要数据、不在乎外观的场景如导入订单明细、商品库存表能显著减少内存占用$objReader new PHPExcel_Reader_Excel2007(); $objReader-setReadDataOnly(true); $objPHPExcel $objReader-load(05featuredemo.xlsx);3.3 只加载指定工作表setLoadSheetsOnly()接收工作表名称数组仅加载匹配的 Sheet$objReader new PHPExcel_Reader_Excel2007(); $objReader-setLoadSheetsOnly( array(Sheet 1, My special sheet) ); $objPHPExcel $objReader-load(05featuredemo.xlsx);3.4 通过读过滤器只读指定单元格setReadFilter()用于按规则裁剪加载范围任何实现PHPExcel_Reader_IReadFilter接口的类都可以作为过滤器。该接口只有一个方法readCell($column, $row, $worksheetName )见 Reader/IReadFilter.php返回true表示该单元格需要读取。默认情况下所有单元格由PHPExcel_Reader_DefaultReadFilter全量读取。下面的过滤器只读取第 1 行以及第 2030 行适合只提取表头 局部数据块的大型报表class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName ) { // Read title row and rows 20 - 30 if ($row 1 || ($row 20 $row 30)) { return true; } return false; } } $objReader new PHPExcel_Reader_Excel2007(); $objReader-setReadFilter( new MyReadFilter() ); $objPHPExcel $objReader-load(06largescale.xlsx);3.5 写入 .xlsx 与公式预计算开关$objWriter new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter-save(05featuredemo.xlsx);默认情况下写入器会预计算工作簿中的所有公式在公式繁多的大表上这会明显拖慢写入速度甚至产生非预期结果。可以通过setPreCalculateFormulas(false)关闭$objWriter new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter-setPreCalculateFormulas(false); $objWriter-save(05featuredemo.xlsx);3.6 Office 2003 兼容包开关Office 2003 兼容包在打开 Excel2007 文件时存在与公式计算相关的缺陷PHPExcel 提供了兼容开关$objWriter new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter-setOffice2003Compatibility(true); $objWriter-save(05featuredemo.xlsx);注意该选项应仅在确实需要时启用。它会禁用若干 Office2007 文件格式特性产出的工作簿功能会降级非必要不要开启。四、Excel 5BIFF / .xls格式读写Excel5 是旧版 Excel 的二进制格式PHPExcel 实现它的目的是让开发者能用统一的方式同时产出 .xlsx 与 .xls。它本质上是 PEAR Spreadsheet_Excel_Writer 的改良版——比原 PEAR 库限制更少、功能更多可以读取 OLE2 封装的 BIFF5Office 95 起到 BIFF8 的全部版本但无法读取更早版本。官方明确表示该格式不会再继续开发仅作为附加格式存在。BIFF 格式限制在对单元格样式化与 PHP 处理大型电子表格两方面存在天然上限。4.1 读取与配置 .xls$objReader new PHPExcel_Reader_Excel5(); $objPHPExcel $objReader-load(05featuredemo.xls);同样支持只读数据、只读指定 Sheet、读取过滤器$objReader new PHPExcel_Reader_Excel5(); $objReader-setReadDataOnly(true); $objPHPExcel $objReader-load(05featuredemo.xls);$objReader new PHPExcel_Reader_Excel5(); $objReader-setLoadSheetsOnly( array(Sheet 1, My special sheet) ); $objPHPExcel $objReader-load(05featuredemo.xls);class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName ) { // Read title row and rows 20 - 30 if ($row 1 || ($row 20 $row 30)) { return true; } return false; } } $objReader new PHPExcel_Reader_Excel5(); $objReader-setReadFilter( new MyReadFilter() ); $objPHPExcel $objReader-load(06largescale.xls);4.2 写入 .xls$objWriter new PHPExcel_Writer_Excel5($objPHPExcel); $objWriter-save(05featuredemo.xls);五、Excel 2003 XML 格式Excel 2003 XML 是可在旧版 Microsoft Excel 中使用的文件格式扩展名 .xml即 SpreadsheetML。限制同样存在于单元格样式化与大型电子表格处理上。$objReader new PHPExcel_Reader_Excel2003XML(); $objPHPExcel $objReader-load(05featuredemo.xml);它同样支持读取过滤器只读第 1 行与第 2030 行class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName ) { // Read title row and rows 20 - 30 if ($row 1 || ($row 20 $row 30)) { return true; } return false; } } $objReader new PHPExcel_Reader_Excel2003XML(); $objReader-setReadFilter( new MyReadFilter() ); $objPHPExcel $objReader-load(06largescale.xml);六、SYLK.slk格式读取SYLKSymbolic Link是 Microsoft 面向应用间交换数据的文本格式尤其常用于电子表格交换文件约定使用 .slk 后缀。它只由可显示的 ANSI 字符构成便于数据库等其他应用创建和处理。限制同样在单元格样式化与大型表格处理方面较弱。$objReader new PHPExcel_Reader_SYLK(); $objPHPExcel $objReader-load(05featuredemo.slk);class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName ) { // Read title row and rows 20 - 30 if ($row 1 || ($row 20 $row 30)) { return true; } return false; } } $objReader new PHPExcel_Reader_SYLK(); $objReader-setReadFilter( new MyReadFilter() ); $objPHPExcel $objReader-load(06largescale.slk);七、Open/Libre Office.ods格式读取.ods 是 OpenOffice / LibreOffice Calc 的标准文件格式。CRMEB 中没有直接使用 OOCalc 读取器但 PHPExcel 本身支持它$objReader new PHPExcel_Reader_OOCalc(); $objPHPExcel $objReader-load(05featuredemo.ods);class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName ) { // Read title row and rows 20 - 30 if ($row 1 || ($row 20 $row 30)) { return true; } return false; } } $objReader new PHPExcel_Reader_OOcalc(); $objReader-setReadFilter( new MyReadFilter() ); $objPHPExcel $objReader-load(06largescale.ods);八、CSV 格式最常用的系统间导入导出载体CSV 常被用作与外部系统交换数据的导入/导出格式。限制CSV 无法表达单元格样式与数字格式等。8.1 基础读取$objReader new PHPExcel_Reader_CSV(); $objPHPExcel $objReader-load(sample.csv);8.2 读取前的选项设置很多 CSV 并非真正“逗号分隔”而是用分号;等分隔符。PHPExcel 允许在读取前配置一系列选项。编码注意事项PHPExcel_Reader_CSV默认假定文件是 UTF-8 编码而 Microsoft Office Excel 生成的 CSV 可能是 Windows-1252CP1252编码务必根据实际文件设置正确的输入编码$objReader new PHPExcel_Reader_CSV(); $objReader-setInputEncoding(CP1252); $objReader-setDelimiter(;); $objReader-setEnclosure(); $objReader-setLineEnding(\r\n); $objReader-setSheetIndex(0); $objPHPExcel $objReader-load(sample.csv);各选项在 Reader/CSV.php 中的默认值分别是setInputEncoding(UTF-8)、setDelimiter(,)、setEnclosure()、setSheetIndex(0)。setLineEnding默认使用平台相关的PHP_EOL。8.3 指定工作表CSV 文件只能包含一个工作表因此需要显式指定读取/写入的目标 Sheet 索引$objReader-setSheetIndex(0);8.4 导入到已存在的电子表格对象当希望把 CSV 数据合并进一个已含多个 Sheet 的PHPExcel对象时使用loadIntoExisting()而非load()。下面代码把 CSV 导入到已有对象的第 6 个工作表索引 5$objReader new PHPExcel_Reader_CSV(); $objReader-setDelimiter(;); $objReader-setEnclosure(); $objReader-setLineEnding(\r\n); $objReader-setSheetIndex(5); $objReader-loadIntoExisting(05featuredemo.csv, $objPHPExcel);从 Reader/CSV.php 的实现看loadIntoExisting会把解析出的单元格按setSheetIndex指定的索引写入目标对象而load()内部同样调用loadIntoExisting()后附上“跳过已有单元格读取”的优化逻辑。8.5 写入 CSV 及选项$objWriter new PHPExcel_Writer_CSV($objPHPExcel); $objWriter-save(05featuredemo.csv);$objWriter new PHPExcel_Writer_CSV($objPHPExcel); $objWriter-setDelimiter(;); $objWriter-setEnclosure(); $objWriter-setLineEnding(\r\n); $objWriter-setSheetIndex(0); $objWriter-save(05featuredemo.csv);写入选项默认值与读取端一致Writer/CSV.php分隔符,、封闭符、行结束符PHP_EOL、Sheet 索引 0。8.6 关闭公式预计算同 Excel2007 写入器一样默认会预计算公式可关闭$objWriter new PHPExcel_Writer_CSV($objPHPExcel); $objWriter-setPreCalculateFormulas(false); $objWriter-save(05featuredemo.csv);8.7 写出带 BOM 的 UTF-8 CSV通过在文件头写入 BOMByte Order Mark标记 UTF-8 编码避免中文内容在 Excel 中乱码$objWriter new PHPExcel_Writer_CSV($objPHPExcel); $objWriter-setUseBOM(true); $objWriter-save(05featuredemo.csv);8.8 小数与千位分隔符导出的工作表若包含带小数/千位分隔符的数字应先想清楚要使用的字符。默认情况下 PHPExcel 依据服务器 locale 设置决定为避免跨服务器环境不一致官方建议显式设置PHPExcel_Shared_String类方法定义见 Shared/String.php英文习惯点分小数、逗号千位PHPExcel_Shared_String::setDecimalSeparator(.); PHPExcel_Shared_String::setThousandsSeparator(,);德文习惯相反PHPExcel_Shared_String::setDecimalSeparator(,); PHPExcel_Shared_String::setThousandsSeparator(.);注意上述设置是全局选项同时会影响 HTML 与 PDF 的导出格式。九、HTML快速呈现与网页内嵌HTML 格式适合给未安装表格软件的读者快速呈现数据也用于加载其他脚本生成“伪装成 .xls 的 HTML 标记”。限制样式化与数字格式能力有限。9.1 读取 HTML$objReader new PHPExcel_Reader_HTML(); $objPHPExcel $objReader-load(05featuredemo.html);注意HTML 读取器目前仍是实验性的尚不能干净地处理合并单元格与嵌套表格。9.2 写入 HTMLPHPExcel_Writer_HTML默认只输出第一个工作表$objWriter new PHPExcel_Writer_HTML($objPHPExcel); $objWriter-save(05featuredemo.htm);写出全部工作表到单个 HTML 文件$objWriter-writeAllSheets();指定具体工作表$objWriter-setSheetIndex(0);9.3 设置图片根路径默认图片引用是相对路径./images/logo.jpg可以显式改为绝对域名路径http://www.example.com便于图片在任意页面位置正确加载$objWriter-setImagesRoot(http://www.example.com);9.4 关闭公式预计算$objWriter new PHPExcel_Writer_HTML($objPHPExcel); $objWriter-setPreCalculateFormulas(false); $objWriter-save(05featuredemo.htm);9.5 分片生成 HTML 并嵌入网页PHPExcel_Writer_HTML提供 4 个分片方法允许把生成的 HTML 嵌入已有站点而不是整页输出generateHTMLHeader()generateStyles()generateSheetData()generateHTMLFooter()示例独立取回所有片段并合并成最终页面?php $objWriter new PHPExcel_Writer_HTML($objPHPExcel); echo $objWriter-generateHTMLHeader(); ? style !-- html { font-family: Times New Roman; font-size: 9pt; background-color: white; } ?php echo $objWriter-generateStyles(false); // do not write style and /style ? -- /style ?php echo $objWriter-generateSheetData(); echo $objWriter-generateHTMLFooter(); ?9.6 UTF-8 与分隔符HTML 同样支持setUseBOM(true)写入 UTF-8 BOM 头小数/千位分隔符的控制方法同 CSV 章节。十、PDF 输出第三方渲染库驱动的写入器PHPExcel_Writer_PDF本身是第三方 PDF 渲染库的封装器支持 tcPDF、mPDF、DomPDF。1.7.8 之前 PHPExcel 内置 tcPDF之后移除需自行安装渲染库。三者各有优劣——有的输出排版更漂亮、有的更快更省内存、有的生成的 PDF 文件更小选择取决于开发者的实际场景。渲染库官方测试所用版本PHPExcel 内部常量tcPDF5.9PDF_RENDERER_TCPDFmPDF5.4PDF_RENDERER_MPDFdomPDF0.6.0 beta 3PDF_RENDERER_DOMPDF10.1 指定渲染库实例化 PDF Writer 之前必须先声明使用的渲染库及路径$rendererName PHPExcel_Settings::PDF_RENDERER_MPDF; $rendererLibrary mPDF5.4; $rendererLibraryPath dirname(__FILE__)./../../../libraries/PDF/ . $rendererLibrary; if (!PHPExcel_Settings::setPdfRenderer( $rendererName, $rendererLibraryPath )) { die( Please set the $rendererName and $rendererLibraryPath values . PHP_EOL . as appropriate for your directory structure ); }10.2 写出 PDF$objWriter new PHPExcel_Writer_PDF($objPHPExcel); $objWriter-save(05featuredemo.pdf);PHPExcel_Writer_PDF默认只输出第一个工作表可用writeAllSheets()写出全部工作表或用setSheetIndex(0)指定单个工作表同样支持setPreCalculateFormulas(false)关闭公式预计算。小数/千位分隔符控制方法同 CSV 章节。十一、从模板生成文件读-改-写三段式实战Reader 与 Writer 的真正价值在于模板化生成当模板已包含大量样式、页面设置、页眉等复杂属性时基于模板修改远比从零构建省力。标准流程是加载模板 → 填充字段 → 另存为新格式。$objPHPexcel PHPExcel_IOFactory::load(template.xlsx); $objWorksheet $objPHPexcel-getActiveSheet(); $objWorksheet-getCell(A1)-setValue(John); $objWorksheet-getCell(A2)-setValue(Smith); $objWriter PHPExcel_IOFactory::createWriter($objPHPexcel, Excel5); $objWriter-save(write.xls);注意读取 xlsx 再生成 xls 是允许的——Reader 与 Writer 的类型不必一致这也体现了 PHPExcel 各格式读取器/写入器可自由组合的设计同理也可以读取 CSV 后写成 Excel2007。十二、在 CRMEB 中的实战对照SpreadsheetExcelService 导出封装文档讲解的这套 Reader/Writer 机制在 CRMEB 仓库中有着同主题的现代化对应实现。SpreadsheetExcelService 是 CRMEB 基于PhpOffice\PhpSpreadsheetPHPExcel 的继任命名空间封装的导出服务逻辑与本指南一脉相承写入器创建与保存excelSave()方法里通过new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet)创建写入器xlsx 时响应头为application/vnd.openxmlformats-officedocument.spreadsheetml.sheetxls 时为application/vnd.ms-excel再以$writer-save(php://output)直接输出到浏览器实现下载或以$writer-save(public_path() . $path)保存到按年/月/日目录结构组织的文件系统并返回路径模板化思想setExcelTile()负责写入标题行、导出人信息与日期setExcelHeader()写入表头setExcelContent()逐行写入数据——这正是“先生成结构模板再批量填充数据”的读-写模式在导出场景下的镜像性能与内存释放与文档建议的setReadDataOnly(true)、setReadFilter()优化大型表格读取相呼应导出完成后excelSave()会调用$spreadsheet-disconnectWorksheets(); unset($spreadsheet);主动释放内存避免大导出在高并发下的内存峰值。十三、实践要点速查场景推荐 API关键配置用户上传未知格式文件PHPExcel_IOFactory::load()自动探测已知 .xlsx 导入new PHPExcel_Reader_Excel2007()setReadDataOnly(true)、setLoadSheetsOnly()、setReadFilter()已知 .xls 导入new PHPExcel_Reader_Excel5()同上CSV 导入含编码/分隔符PHPExcel_Reader_CSVsetInputEncoding()、setDelimiter()、setLineEnding()、setSheetIndex()CSV 导入已有对象loadIntoExisting()指定目标 Sheet 索引导出 .xlsx / .xlsPHPExcel_IOFactory::createWriter($obj, Excel2007/Excel5)setPreCalculateFormulas(false)提速导出 CSV中文不乱码PHPExcel_Writer_CSVsetUseBOM(true) 显式分隔符HTML 快速预览/嵌入网页PHPExcel_Writer_HTMLgenerateHTMLHeader()等 4 个分片方法PDF 分发PHPExcel_Writer_PDF先setPdfRenderer()指定渲染库复杂样式模板读-改-写三段式load()→getCell()→createWriter()核心结论读取与写入贯穿整个文件格式家族xlsx、xls、Excel2003 XML、SYLK、ODS、CSV、HTML、PDFPHPExcel_IOFactory提供了自动识别与显式创建两种统一入口面对大型文件优先使用setReadDataOnly(true)、setReadFilter()、setLoadSheetsOnly()控制读取范围并视公式情况关闭写入端的预计算面对模板化需求直接采用“加载模板—填充—另存”的组合拳即可在极少的编码量下产出高质量报表。在 CRMEB 中这套能力既可应用于业务层的SpreadsheetExcelService数据导出也可用于扩展 PHPExcel 旧接口实现对历史格式如 SYLK、Excel2003 XML的兼容处理。赞分享后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载相关推荐CRMEB 集成 PhpSpreadsheet 实战从 Excel 读写引擎到订单、用户数据导出全链路解析CRMEB 集成 PhpSpreadsheet 实战从 Excel 读写引擎到订单、用户数据导出全链路解析 本文围绕 CRMEB 开源商城仓库中内置的 PHP后端电商前端CRMEB 项目中 PHPExcel 工作簿读取完全指南从 IOFactory 自动加载到 ReadFilter 精细控制CRMEB 项目中 PHPExcel 工作簿读取完全指南从 IOFactory 自动加载到 ReadFilter 精细控制 导读 在 CRMEB基于 Thi后端电商前端PHPExcel 文件读写完整指南IOFactory 工厂与 Excel2007/Excel5/CSV/HTML/PDF 等格式的读取与写入实战PHPExcel 文件读写完整指南IOFactory 工厂与 Excel2007/Excel5/CSV/HTML/PDF 等格式的读取与写入实战 本指南以 P后端数据处理上一篇Apache Arrow C 开发指南编译告警等级、测试基准、代码风格与 CI 检查实战下一篇ZCode 技能系统实践React Best Practices 规则模板的结构解析与规则编写指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站