微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

导出为 CSV 百分比格式

如何解决导出为 CSV 百分比格式

导出的 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,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 端手动执行此操作。

解决方法

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

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

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

我能够通过更改这一行来解决问题:

CREATE TABLE [dbo].[Customer] (
    [CustomerId]        INT          IDENTITY (1,1) NOT NULL,[CustomerName]      VARCHAR (50) NOT NULL,[CustomerAddress]   VARCHAR (50) NOT NULL,[CustomerTelephone] VARCHAR (50) NOT NULL,[CustomerEmail]     VARCHAR (50) NOT NULL,[CustomerType]      VARCHAR (15) NOT NULL,CONSTRAINT [Pk_Name] PRIMARY KEY CLUSTERED ([CustomerId] ASC)
);
 ~ ~ ~
Code for the Add form 
 ~ ~ ~

private void btnSave_Click(object sender,EventArgs e)
        {
            if(txtName.Text =="" || txtAddress.Text =="" || txtPhoneNo.Text =="" || txtEmail.Text =="" || cboCustomerType.Text =="" 
                || txtMake.Text == "" || txtModel.Text =="" || txtRegistration.Text =="" || txtMaintenanceNo.Text =="" || cboService.Text ==""
                || txtDateofService.Text =="")
            {
                MessageBox.Show("Please enter all details");
            }
            else
            {
                using (SqlConnection sqlCon = new SqlConnection(connectionString))
                {
                    sqlCon.Open();
                    SqlCommand sqlcmd = new SqlCommand("AddDetails",sqlCon);
                    sqlcmd.CommandType = CommandType.StoredProcedure;

                    //add the data from the textbox into the @Name and store it in the database 
                    sqlcmd.Parameters.AddWithValue("@CustomerName",txtName.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@CustomerAddress",txtAddress.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@CustomerTelephone",txtPhoneNo.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@CustomerEmail",txtEmail.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@CustomerType",cboCustomerType.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@CarMake",txtMake.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@CarModel",txtModel.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@CarReg",txtRegistration.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@MaintenanceNo",txtMaintenanceNo.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@Service",cboService.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@Problems",txtProblems.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@ServiceHistory",txtServiceHistory.Text.Trim());
                    sqlcmd.Parameters.AddWithValue("@DateofService",txtDateofService.Text.Trim());





                    //execute query 
                    sqlcmd.ExecuteNonQuery();

                    //message box to show details have been entered 
                    MessageBox.Show("Details Saved");

为此:

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

现在,即使在格式化 Excel 后,字段仍显示 100% 或 50%。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。