Excel 正在从 CSV 文件中去除前导 0
Posted
技术标签:
【中文标题】Excel 正在从 CSV 文件中去除前导 0【英文标题】:Excel is stripping leading 0's from CSV files 【发布时间】:2014-08-28 00:52:28 【问题描述】:它认为 Excel 正在剥离前导 0。有人告诉我,在导出期间将列格式更新为文本将解决此问题并修改 Excel 输出(来自“ProofAndTracking actionIpromoteuAutomation”文件,但我找不到此文件或如何访问生成 excel 格式代码的位置) .
我从未使用过 Excel。我试过这个,但它似乎是一个本地修复: http://excelribbon.tips.net/T010262_Handling_Leading_Zeros_in_CSV_Files.html 有人能指出我正确的开始方向吗?
我研究了这些答案How to stop the leading 0's from being stripped off when exporting to excel from a datatable? 和Export Excel : Avoid stripping the leading zeros 提前致谢!
这是我认为导致问题的函数,但尚不确定如何在此处将列格式化为文本。 /* * 为 ipromoteu (150837) 格式化并发送当天的订单和跟踪信息(通过 Excel 电子表格) */
public function actionIpromoteuAutomation()
$ordersGroup1 = $this->getIpromoteuProof();
$ordersGroup2 = $this->getIpromoteuProofHistory();
$orders = array_merge($ordersGroup1, $ordersGroup2);
$fileName = 'Hit Promo Order Tracking ' . date('m-d-Y');
$this->_export($orders, $fileName);
$fileName = $fileName . '.xls';
$toIPROMOTEU = array(//email to be sent to HR when request is submitted
'body' => 'Attached, please find the Excel spreadsheet containing'
. ' order details for orders on ' . date('m/d/Y') . '.',
'from_email' => 'donotreply@hitpromo.net',
'from_name' => 'Hit Promotional Products',
'subject' => 'Order Tracking Information - ' . date('m/d/Y'),
'to_emails' => 'orders@ipromoteu.com',
'attachments' => array(array('path' => Yii::app()->basePath . '/../tmp/' . $fileName, 'filename' => $fileName)),
);
Hit::email((object) $toIPROMOTEU);
$this->logForDeveloper('Order records sent to iPromoteU for '. date('m/d/Y'));
private function _export($data, $fileName, $format = 'excel', $output = false)
// get a reference to the path of phpExcel classes
$phpExcelPath = Yii::getPathOfAlias('ext.phpexcel');
// Turn off our yii library autoload
spl_autoload_unregister(array('YiiBase', 'autoload'));
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
if ($format == 'excel')
// Set properties
$objPHPExcel->getProperties()->setCreator(Yii::app()->user->name)
->setLastModifiedBy(Yii::app()->user->name)
->setTitle('Order Tracking Report');
$styleArray = array(
'font' => array(
'bold' => true,
'underline' => true,
)
);
$objPHPExcel->setActiveSheetIndex(0);
$sheet = $objPHPExcel->getActiveSheet();
for ($rowCounter = 0; $rowCounter < sizeof($data); $rowCounter++)
$sheet->getStyle("A" . ($rowCounter + 1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
$sheet->getStyle("B" . ($rowCounter + 1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
$sheet->getStyle("C" . ($rowCounter + 1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
$sheet->setCellValue("A" . ($rowCounter + 1), date('m/d/Y', strtotime($data[$rowCounter]['date'])));
//$sheet->setCellValue("A".($rowCounter+1), $data[$rowCounter]['date']);
if ($data[$rowCounter]['fedex_tracking'] != '')
$sheet->setCellValue("B" . ($rowCounter + 1), $data[$rowCounter]['fedex_tracking']);
else
$sheet->setCellValue("B" . ($rowCounter + 1), $data[$rowCounter]['other_tracking']);
$sheet->setCellValue("C" . ($rowCounter + 1), $data[$rowCounter]['sales_order_number']);
$sheet->getStyle("B" . ($rowCounter + 1))->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER);
$sheet->setCellValue("A1", "DATE")
->setCellValue("B1", "TRACKING")
->setCellValue("C1", "PO NUMBER")
->getStyle("A1:C1")->applyFromArray($styleArray);
////Set the column widths
$sheet->getColumnDimension("A")->setWidth(25);
$sheet->getColumnDimension("B")->setWidth(25);
$sheet->getColumnDimension("C")->setWidth(25);
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Order Tracking Report');
// Set active sheet index to the first sheet,
// so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
$fileName = $fileName . ($format == 'excel' ? '.xls' : '.csv');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$path = Yii::app()->basePath . '/../tmp/' . $fileName;
$objWriter->save($path);
// Once we have finished using the library, give back the
// power to Yii...
spl_autoload_register(array('YiiBase', 'autoload'));
public function getIpromoteuProof()
$date = date('Ymd');
$db2params = Yii::app()->params['db2params'];
$db = Zend_Db::factory('Db2', $db2params);
$select = $db->select()
->from(
// table
array('t' => 'WBPIPRAE'),
// columns
array(
'sales_order_number' => 'TRIM(WAESPO#)',
),
// schema
$db2params['schemas']['hitdta'])
->joinLeft(
// table
array('f' => 'MFD1MD'), 'CONCAT(TRIM(WAEORD#),RIGHT(TRIM(MDORDR),3))=TRIM(MDORDR)',
// columns
array(
'fedex_tracking' => 'TRIM(MDFTRK)',
'other_tracking' => 'TRIM(MDFBRC)',
'date' => 'TRIM(MDUPDT)',
),
// schema
$db2params['schemas']['varfil'])
->where("MDUPDT = '" . $date . "'")
->where("WAEIVKY='150837'")
->order('sales_order_number')
->distinct(true);
$stmt = $db->query($select);
$orders = $stmt->fetchAll();
return $orders;
【问题讨论】:
您是否正在寻找出口方面的解决方案? csv 文件是否仅由 Excel 使用,还是在其他地方读取? 嗨。是的,显然我的同事认为它正在导出,并且只被 Excel 使用。 经过大量研究,现在尝试此代码! cmets 赞赏.. // 将列格式化为文本以避免 Excel 讨厌的剥离习惯——从数字中剥离前导“0”。 $objPHPExcel->getActiveSheet()->setStyle(PHPExcel_Cell_DataType::TYPE_STRING); 【参考方案1】:好的,Excel 可以将 csv 列创建为 text
,但问题在于导入。
当 Excel 打开 csv 文件时,它会“有效地”将任何看起来像数字的东西转换为数字,去除前导零。
首先确保 Excel 按应有的方式导出它,在文本编辑器中打开文件并检查是否存在前导零。
您可能必须更改文件的导入方式。他们需要运行数据导入向导,而不是只需双击 csv 文件:
导入“从文本”
选择分隔符
确保逗号打勾
选择列作为文本
这应该可以解决另一边的问题。
另一种选择是在数字前添加一个撇号 '
,但是如果他们使用宏/软件与文件交互,这可能会破坏这一点。
编辑
查看 PHP 代码(我无法测试)后,您也许可以更改该行:
$sheet->getStyle("B" . ($rowCounter + 1))->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER);
收件人:
$sheet->getStyle("B" . ($rowCounter + 1))->getNumberFormat()->setFormatCode('000000000000'); // With however many zero's you need to keep
但是,当您导出时,它仍然可能会被删除,因为它在技术上仍然是一个数字,并且格式将被删除。
【讨论】:
这样做了,谢谢,但我认为它在我们的 php 代码中的某个地方格式化了,我必须在导出期间将列格式更新为文本。 @DR1 在文本编辑器中打开 csv 文件时是否缺少前导零? 是的,这就是我们认为需要将列格式化为文本的原因。请参阅上面我认为需要执行此操作的功能。 非常感谢。我现在离解决这个问题更近了! 单个撇号在 LibreOffice 中不起作用。我现在正在使用提议的here 的TAB\t
字符。以上是关于Excel 正在从 CSV 文件中去除前导 0的主要内容,如果未能解决你的问题,请参考以下文章