【问题标题】:export to CSV percentage formatting导出为 CSV 百分比格式
【发布时间】:2021-04-11 15:12:16
【问题描述】:

导出的 CSV 文件中的百分比格式存在问题。

这是抓取数据并将其发送回 JQuery 以进行导出的过程:

<?php
  include('include/sessions.php');

  $date_begin = date("Y-m-d", strtotime($_POST['date_begin']));
  $date_end = date("Y-m-d", strtotime($_POST['date_end']));

  $sql = "SELECT table1.services, table1.port
          sum(case when TIMESTAMPDIFF(HOUR,table2.berth,table1.performance) <= -12 then 0 else 1 end) ON_TIME,
          count(table1.port) TTL_CALLS,
          round((sum(case when TIMESTAMPDIFF(HOUR,table2.berth,table1.performance) <= -12 then 0 else 1 end)/count(table1.port))*100,1) as ON_TIME_PCT
          FROM
            table1
          Left Outer Join table2 ON table1.voyage = table2.voyage AND table1.port = table2.port
          WHERE
            date( table1.performance ) >= '$date_begin' AND
            date( table1.performance ) <= '$date_end'";

  $query = mysqli_query($dbc, $sql) or die(mysqli_error($dbc));

  $out = array();
  while($row = $query->fetch_assoc()){
    $out[] = $row;
  }
  echo json_encode($out);
  
?>

我指的字段是 ON_TIME_PCT。

使用上述方法,在 dB 本身中运行查询时,对引用字段的查询结果可以在 100.0 或 50.0 之间变化。

导出数据时,单元格最初看起来像 100 或 50。

在 Excel 中更改格式以显示完整百分比时,数字看起来像 10000% 或 5000%。

我不知道为什么会这样。

这是我用来导出到 CSV 的代码:

$('#byPortService').on('click', function(){

  var date_begin = $('#date_begin').val();
  var date_end = $('#date_end').val();

  $.post('api/byPortService.php', {date_begin:date_begin,date_end:date_end}, function(data){
    JSONToCSVConvertor(data, "BY PORT SERVICE REPORT - DATE RANGE: "+date_begin+" - "+date_end+"", true);
  });
});

这里是 JSONToCSVConvertor 函数:

function JSONToCSVConvertor(JSONData, ReportTitle, ShowLabel){
  var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;
  var CSV = '';
  CSV += ReportTitle + '\r\n\n';
  if (ShowLabel) {
    var row = "";
    for (var index in arrData[0]) {
      row += index + ',';
    }
    row = row.slice(0, -1);
    CSV += row + '\r\n';
  }
  for (var i = 0; i < arrData.length; i++) {
    var row = "";
    for (var index in arrData[i]) {
      row += '"' + arrData[i][index] + '",';
    }
    row.slice(0, row.length - 1);
    CSV += row + '\r\n';
   }
   if (CSV == '') {
     alert("Invalid data");
     retirn;
   }
   var fileName = ReportTitle.replace(/ /g,"_");
   var uri = 'data:text/csv;charset=utf-8,' + escape(CSV);
   var link = document.createElement("a");
   link.href = uri;
   link.style = "visibility:hidden";
   link.download = fileName + ".csv";
   document.body.appendChild(link);
   link.click();
   document.body.removeChild(link);
}

有什么方法可以导出百分比以保留小数点吗?

我不希望用户必须在 Excel 端手动执行此操作。

【问题讨论】:

  • 您需要将这些值除以 100。Excel 将其转换为百分比,1100%.550%
  • @AbraCadaver - 你指的是这部分吗:count(table1.port))*100,1)
  • 1 在 Excel 中是 100%0.550%
  • 我没有把所有的代码都看一遍,但是你需要把结果分开。
  • 在代码中使用die(mysqli_error($conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?

标签: javascript php jquery formatting export


【解决方案1】:

我可以通过更改这一行来解决问题:

round((sum(case when TIMESTAMPDIFF(HOUR,table2.berth,table1.performance) <= -12 then 0 else 1 end)/count(table1.port))*100,1) as ON_TIME_PCT

到这里:

concat(round((sum(case when TIMESTAMPDIFF(HOUR,table2.berth,table1.performance) <= -12 then 0 else 1 end)/count(table1.port))*100,0),'%') as ON_TIME_PCT

现在,即使在格式化 Excel 之后,这些字段也显示 100% 或 50%。

感谢大家的帮助。为大家点赞。

【讨论】:

    【解决方案2】:

    就像 cmets 中提到的那样,确保值介于 01 之间。

    要在 PHP 中保留一定数量的小数,请使用 number_format()

    <?php
    $number = 0.5;
    formatted number = number_format($number, 2);  // 0.50
    ?>
    

    【讨论】:

    • 如何在查询中应用它?
    • 不确定 json 结构是什么。你能发布一个样本(2~3行)吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2021-08-12
    • 1970-01-01
    • 2015-09-30
    • 2016-03-13
    相关资源
    最近更新 更多