PHP 导出CSV文件,数据丢失
PHP
导出数据行有三万多行,xls
导出是没问题的,但是十月 fputcsv
方法导出的csv
格式后,会少30行数据,这里使用csv导出时是分批次拉取数据写入的,每次1000条。查了网上说有可能是字符集的问题,但是通过和xlsx
比对之后的30条数据再单独使用csv导出却是可以直接导出的。
$data_total = $this->getExportDataTotal();
$pageSize = 2000;
$pageNum = ceil($data_total / $pageSize);
for ($page = 1; $page <= $pageNum; $page++) {
if (ob_get_length()) {
ob_end_clean();
}
//表头标题
if ($page == 1) {
// 标题
$column_title = "公司ID#公司名称";
$column_title = explode('#', $column_title);
foreach ($column_title as $i => $v) {
$column_title[$i] = iconv('UTF-8', 'GBK//IGNORE', $v);
}
fputcsv($fp, $column_title);
// 字段
$column_fields = 'COMPANY_ID#COMPANY_NAME';
$column_fields = explode('#', $column_fields);
foreach ($column_fields as $i => $v) {
$column_fields[$i] = iconv('UTF-8', 'GBK//IGNORE', $v);
}
fputcsv($fp, $column_fields);
}
$filter_data['start'] = ($page - 1) * $pageSize;
$filter_data['limit'] = $pageSize;
$orders = $this->getExportDatas($filter_data);
$export_data = array();
foreach ($orders as $key => $val) {
if ($val) {
$tmp = $val;
$export_data[] = $tmp;
unset($orders[$key]);
}
}
// 数据
foreach ($export_data as $item) {
$element = array();
foreach ($column_fields as $field) {
$element_str = isset($item[$field]) ? iconv('UTF-8', 'GBK//IGNORE', $item[$field]) : '';
$element[] = $element_str;
}
fputcsv($fp, $element, ',', '"');
}
// 将已经写到csv中的数据存储变量销毁,释放内存占用
unset($export_data);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1、用文本编辑器打开cvs,看下是否有少、是否有些特殊字符
2、确认3万多行,每次1000 ,少30 行,是否为每次少了一行
不太清楚楼主真正的原因,只是我觉得不太会因为字符的问题。楼主可以把set_time_limit()时间长一些,然后在foreach()内记录下数据行信息,有助于你快速解决问题。
分享一个我自己基于PhpSpreadsheet封装的导出数据函数,代码片段,仅供参考: