You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy开发Android应用:Excel文件保存失败问题求助

Kivy打包Android后无法保存Excel文件的解决方案

问题核心原因

  • Android沙盒限制:应用无法直接使用相对路径写入文件,必须选择应用有权限访问的合法目录
  • 文件名格式错误:代码中my_textinput+'xlsx'缺少.,生成的文件无.xlsx后缀,难以被系统识别
  • 缺少存储权限:Android要求显式申请存储权限,才能写入公共目录或外部存储

分步解决方案

1. 修复文件名格式

将创建工作簿的代码:

workbook= xlsxwriter.Workbook(my_textinput+'xlsx')

修改为:

workbook= xlsxwriter.Workbook(f"{my_textinput}.xlsx")

2. 适配Android存储路径

通过Kivy的platform模块判断运行平台,获取对应合法存储目录:

  • Android优先使用公共文档目录(/storage/emulated/0/Documents/),确保文件能被用户在文件管理器中找到
  • Windows保持原相对路径逻辑

3. 添加存储权限配置

在buildozer.spec文件中修改以下配置:

# 添加依赖库
requirements = python3,kivy,xlsxwriter,plyer

# 添加存储权限
android.permissions = WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE
# Android 13+ 额外补充权限
android.permissions += READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO

修改后的完整main.py代码

from kivy.app import App
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.utils import platform
import xlsxwriter
import os
from plyer import permissions
from kivy.uix.label import Label

class Boxlayoutexam(BoxLayout):
    my_text = StringProperty('Data Acquisition to be started')
    def on_button_click(self):
        self.my_text = 'Data Acquisition started'

class StartPopup(Popup):
    def get_save_path(self, filename):
        # 按平台返回合法存储路径
        if platform == 'android':
            doc_dir = '/storage/emulated/0/Documents/'
            # 确保目录存在
            if not os.path.exists(doc_dir):
                os.makedirs(doc_dir)
            return os.path.join(doc_dir, filename)
        else:
            return filename

    def request_permissions(self):
        # Android平台请求存储权限
        if platform == 'android':
            permissions.request('WRITE_EXTERNAL_STORAGE')
            permissions.request('READ_EXTERNAL_STORAGE')

    def on_yes_button_click(self):
        self.request_permissions()
        my_textinput = self.ids.my_textinput.text.strip()
        # 处理空输入
        if not my_textinput:
            my_textinput = 'Diabetic_Data'
        
        filename = f"{my_textinput}.xlsx"
        save_path = self.get_save_path(filename)
        
        try:
            workbook = xlsxwriter.Workbook(save_path)
            worksheet = workbook.add_worksheet('Diabetic Data')
            # 写入测试数据验证文件有效性
            worksheet.write('A1', 'Sample Data')
            workbook.close()
            # 可添加打印日志方便调试
            print(f"文件已保存至: {save_path}")
        except Exception as e:
            # 弹出错误提示
            error_popup = Popup(title='保存失败', content=Label(text=f'错误原因: {str(e)}'), size_hint=(0.6, 0.6))
            error_popup.open()

class myapp(App):
    pass

if __name__ == '__main__':
    myapp().run()

额外调试提示

  • 生成的Excel文件可在Android文件管理器的内部存储 > Documents目录下找到
  • 若文件未即时显示,可等待媒体库索引完成,或通过ADB命令验证:adb shell ls /storage/emulated/0/Documents/
  • 确保greentick.png已添加到buildozer.spec的android.add_assets配置中,避免图片加载失败

内容的提问来源于stack exchange,提问作者Reivanth K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:30:50