js报表实现
使用原生JavaScript实现报表
原生JavaScript可以通过操作DOM元素和Canvas来实现报表功能。例如使用Canvas绘制图表:
// 获取Canvas元素
const canvas = document.getElementById('chart');
const ctx = canvas.getContext('2d');
// 绘制柱状图
function drawBarChart(data) {
const barWidth = 40;
const maxValue = Math.max(...data);
const scale = canvas.height / maxValue;
data.forEach((value, index) => {
const barHeight = value * scale;
const x = index * (barWidth + 10);
const y = canvas.height - barHeight;
ctx.fillStyle = 'blue';
ctx.fillRect(x, y, barWidth, barHeight);
// 添加文本标签
ctx.fillStyle = 'black';
ctx.fillText(value, x, y - 5);
});
}
// 调用绘制函数
drawBarChart([50, 80, 120, 90, 60]);
使用第三方库实现报表
流行的JavaScript图表库可以简化报表开发:
// 使用Chart.js示例
const ctx = document.getElementById('myChart').getContext('2d');
const chart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['January', 'February', 'March', 'April'],
datasets: [{
label: 'Sales',
data: [65, 59, 80, 81],
backgroundColor: 'rgba(75, 192, 192, 0.2)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
报表数据绑定
动态数据绑定是报表的关键功能:
// 使用fetch获取数据
async function loadReportData() {
try {
const response = await fetch('/api/report');
const data = await response.json();
updateChart(data);
} catch (error) {
console.error('Error loading report data:', error);
}
}
function updateChart(data) {
// 更新图表数据逻辑
}
响应式报表设计
确保报表在不同设备上正常显示:
// 响应式调整
window.addEventListener('resize', function() {
const chartContainer = document.getElementById('chart-container');
const aspectRatio = 16 / 9;
if (window.innerWidth < 768) {
chartContainer.style.width = '100%';
chartContainer.style.height = (window.innerWidth / aspectRatio) + 'px';
} else {
chartContainer.style.width = '80%';
chartContainer.style.height = '500px';
}
// 重新绘制图表
chart.resize();
});
报表导出功能
实现报表导出为图片或PDF:
// 导出为图片
function exportToPNG() {
const chartCanvas = document.getElementById('myChart');
const link = document.createElement('a');
link.download = 'report.png';
link.href = chartCanvas.toDataURL('image/png');
link.click();
}
// 使用jsPDF导出为PDF
function exportToPDF() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const chartCanvas = document.getElementById('myChart');
const imgData = chartCanvas.toDataURL('image/png');
doc.addImage(imgData, 'PNG', 10, 10, 180, 100);
doc.save('report.pdf');
}
交互式报表功能
添加交互功能提升用户体验:
// 添加点击事件
document.getElementById('myChart').onclick = function(evt) {
const points = chart.getElementsAtEventForMode(
evt,
'nearest',
{ intersect: true },
true
);
if (points.length) {
const firstPoint = points[0];
const label = chart.data.labels[firstPoint.index];
const value = chart.data.datasets[firstPoint.datasetIndex].data[firstPoint.index];
alert(`Selected: ${label} - ${value}`);
}
};
报表主题定制
自定义报表样式和主题:
// 设置主题
function setChartTheme(theme) {
if (theme === 'dark') {
Chart.defaults.backgroundColor = '#333';
Chart.defaults.borderColor = '#555';
Chart.defaults.color = '#fff';
} else {
Chart.defaults.backgroundColor = '#fff';
Chart.defaults.borderColor = '#ddd';
Chart.defaults.color = '#333';
}
chart.update();
}






