当前位置: 首页 > news >正文

用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App(九)签到历史报表 + Excel 导出

用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App

登录 / 签到历史报表查询 + 按日期筛选 + 导出 Excel

在前面的章节中,我们已经完成了:

  • ✅ 用户登录
  • ✅ 签到记录入库
  • ✅ 多租户数据隔离
  • ✅ 基于 FreeSql 的数据访问封装

本章作为最终章节,我们将实现一个管理端功能

📊 签到 / 登录历史报表

  • 按日期区间查询
  • 列表展示签到明细
  • 一键导出 Excel
  • 使用系统分享(微信 / 邮件 / AirDrop 等)

一、功能效果概览

页面包含以下几个核心功能点:

  1. 日期筛选

    • 起始日期
    • 结束日期
  2. 查询按钮

    • 根据时间范围查询所有签到记录
  3. 报表列表

    • 用户名
    • 租户名称
    • 签到时间
  4. 导出 Excel

    • 生成 .xlsx
    • 调用系统分享能力

二、报表页面 XAML 布局

我们先定义一个 SignInReportPage.xaml,整体采用 VerticalStackLayout,结构简单直观:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="SignInMauiApp.SignInReportPage"><VerticalStackLayout Padding="20,30" Spacing="10"><Label Text="签到历史报表"FontSize="22"HorizontalOptions="Center" /><!-- 日期筛选 --><HorizontalStackLayout Spacing="10"><DatePicker x:Name="StartDatePicker" /><Label Text="至" VerticalOptions="Center" /><DatePicker x:Name="EndDatePicker" /><Button Text="查询" Clicked="OnQueryClicked" /></HorizontalStackLayout><!-- 导出 --><Button Text="导出Excel" Clicked="OnExportClicked" /><!-- 报表列表 --><CollectionView x:Name="ReportCollectionView"><CollectionView.ItemTemplate><DataTemplate><Frame Margin="0,5" Padding="10" BorderColor="#ccc"><VerticalStackLayout><Label Text="{Binding Username}" /><Label Text="{Binding TenantName}" /><Label Text="{Binding SignInTime,StringFormat='签到时间:{0:yyyy-MM-dd HH:mm:ss}'}" /></VerticalStackLayout></Frame></DataTemplate></CollectionView.ItemTemplate></CollectionView></VerticalStackLayout>
</ContentPage>

三、页面后台逻辑(FreeSql + MiniExcel)

1️⃣ 构造函数 & 默认时间范围

  • 默认查询最近 7 天
  • 通过 DI 获取 FreeSql 实例
public partial class SignInReportPage : ContentPage
{private readonly IFreeSql? _fsql;private List<SignInReportItem> _report = new();public SignInReportPage(){InitializeComponent();_fsql = IPlatformApplication.Current?.Services.GetService<IFreeSql>();StartDatePicker.Date = DateTime.Today.AddDays(-7);EndDatePicker.Date = DateTime.Today;LoadReport();}
}

2️⃣ 查询签到历史(多表 Join)

通过 FreeSql 进行三表关联:

  • SignInRecord
  • User
  • Tenant
private void LoadReport()
{var start = StartDatePicker.Date;var end = EndDatePicker.Date!.Value.AddDays(1);_report = _fsql!.Select<SignInRecord, User, Tenant>().LeftJoin((r, u, t) => r.UserId == u.Id).LeftJoin((r, u, t) => r.TenantId == t.Id).Where((r, u, t) =>r.SignInTime >= start &&r.SignInTime < end).ToList((r, u, t) => new SignInReportItem{Username = u.Username,TenantName = t.Name,SignInTime = r.SignInTime});ReportCollectionView.ItemsSource = _report;
}

点击 查询按钮 即可重新加载:

private void OnQueryClicked(object sender, EventArgs e)
{LoadReport();
}

四、导出 Excel(MiniExcel + MAUI Share)

1️⃣ 使用 MiniExcel 生成报表

private async void OnExportClicked(object sender, EventArgs e)
{if (_report.Count == 0){await DisplayAlertAsync("提示", "无数据可导出", "确定");return;}var fileName = $"签到报表_{DateTime.Now:yyyyMMddHHmmss}.xlsx";var filePath = Path.Combine(FileSystem.CacheDirectory, fileName);await MiniExcel.SaveAsAsync(filePath, _report);

2️⃣ 调用系统分享能力

MAUI 内置 Share.RequestAsync,跨平台通用:

    if (!File.Exists(filePath)){await DisplayAlertAsync("错误", "文件未生成,无法分享", "确定");return;}try{await Share.RequestAsync(new ShareFileRequest{Title = "导出签到报表",File = new ShareFile(filePath),});}catch (Exception ex){await DisplayAlertAsync("错误", ex.Message, "确定");}
}

📱 Android / iOS / Windows / macOS 都可以正常弹出分享面板。


五、报表 DTO 模型

public class SignInReportItem
{public string? Username { get; set; }public string? TenantName { get; set; }public DateTime SignInTime { get; set; }
}

六、技术点总结(系列收官)

本系列完整覆盖了一个 真实可落地的 MAUI 应用

  • ✅ .NET MAUI 10 跨平台 UI
  • ✅ FreeSql 多表查询
  • ✅ VS Copilot 辅助开发
  • ✅ 日期筛选 + 报表展示
  • ✅ MiniExcel 导出 Excel
  • ✅ MAUI Share 跨平台分享

到这里,一个 可用于内部管理 / 考勤 / 登录审计 的签到 App 就已经完整闭环 🎉

http://www.jsqmd.com/news/120398/

相关文章:

  • 2025年童装羽绒服十大品牌盘点:宝妈选购指南与口碑单品解析 - 品牌测评鉴赏家
  • 【LangChain4J】聊天数据持久化——Redis
  • 宝妈必看|0-16岁童装羽绒服品牌全攻略,从保暖到颜值一次搞定 - 品牌测评鉴赏家
  • 环境搭建-运行前端工程(Nginx) - 努力-
  • Ant Design 色板生成算法演进之路
  • AI 领域职业发展分享总结(吴恩达新课内容分享)
  • 2025年童装羽绒服大揭秘!这十款温暖又时尚 - 品牌测评鉴赏家
  • 用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App (十) 完结篇
  • Windows 10版本 - 努力-
  • 滑动窗口|209. 长度最小的子数组|713. 乘积小于 K 的子数组|3. 无重复字符的最长子串
  • C++20和C++23 在内存管理、并发控制和类型安全相关优化方式的详细技术分析
  • Java毕设项目推荐-基于springboot电子招投标系统基于springboot的在线招标系统的设计与实现【附源码+文档,调试定制服务】
  • 0-16岁童装羽绒服选购攻略:2025宝妈必看的品牌指南 - 品牌测评鉴赏家
  • windows clion 更新 MinGW 的工具链
  • 现代cpp在传统内存分配上的改进
  • Java毕设项目推荐-基于springboot小区团购管理设计与实现基于springboot的社区团购系统的设计与实现【附源码+文档,调试定制服务】
  • 2025年高性价比童装品牌推荐清单:宝妈闭眼入的口碑之选 - 品牌测评鉴赏家
  • JavaScript现代语法梳理:ES6+核心特性详解 - 教程
  • 2025年12月青少年羽绒服大揭秘!这些品牌闭眼入 - 品牌测评鉴赏家
  • Java毕设项目推荐-基于springboot的物业报修系统的设计与实现业主报修、物业派单、维修跟进、耗材管理、评价反馈于一体的数字化平台【附源码+文档,调试定制服务】
  • 强化学习之DQN游戏训练
  • 宝妈必藏!小童童装品牌实力排名出炉,安全舒适又时髦 - 品牌测评鉴赏家
  • Thinkphp和Laravel幼儿园网站系统vue
  • 中大童童装选购指南:从材质到穿搭,宝妈必看的实用攻略 - 品牌测评鉴赏家
  • 用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App (十) 完结篇
  • Flink源码阅读:如何生成ExecutionGraph
  • 用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App (十) 完结篇
  • 2025年秋冬必看!儿童羽绒服十大名牌大揭秘 - 品牌测评鉴赏家
  • VOC vs COCO vs YOLO格式终极对比:2025年目标检测项目到底该选哪个标注格式?避坑指南+决策树
  • 《AI应用架构师:在AI驱动数字转型的浪潮中破浪前行》