如何解决导出为 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 端手动执行此操作。
解决方法
就像评论中提到的那样,确保值介于 0
和 1
之间。
要在 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 举报,一经查实,本站将立刻删除。