Android实现Excel表格样式

article/2025/9/23 13:27:27

原理描述:

想写来着,但是似乎描述不太清楚。效果图来着,没找到好的视频录制软件,直接上代码吧。

代码:

1、xml布局文件

自定义控件的包名删除了部分,需要重新导入自定义控件!!!

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="50dp"android:layout_weight="1"android:gravity="center"android:orientation="vertical"android:text="标题" /><Viewandroid:layout_width="1px"android:layout_height="50dp"android:background="#cccccc" /><LinearLayoutandroid:id="@+id/lin_header_content"android:layout_width="0dp"android:layout_height="50dp"android:layout_weight="3"android:orientation="vertical"><views.excel.SyncHorizontalScrollViewandroid:id="@+id/header_horizontal"android:layout_width="wrap_content"android:layout_height="50dp"android:overScrollMode="never"android:scrollbars="none"><LinearLayoutandroid:id="@+id/ll_excel_title_container"android:layout_width="wrap_content"android:layout_height="50dp"android:orientation="horizontal" /></views.excel.SyncHorizontalScrollView></LinearLayout></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1px"android:background="#cccccc" /><ScrollViewandroid:id="@+id/scroll_content"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"android:scrollbars="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentTop="true"android:orientation="horizontal"><views.excel.NoscrollListViewandroid:id="@+id/lv_left"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:overScrollMode="never"android:scrollbars="none" /><Viewandroid:layout_width="1px"android:layout_height="match_parent"android:background="#cccccc" /><LinearLayoutandroid:id="@+id/lin_data_content"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"android:orientation="vertical"><views.excel.SyncHorizontalScrollViewandroid:id="@+id/data_horizontal"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"android:scrollbars="none"><views.excel.NoscrollListViewandroid:id="@+id/lv_data"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"android:scrollbars="none" /></views.excel.SyncHorizontalScrollView></LinearLayout></LinearLayout></ScrollView></LinearLayout>

2、activity界面

public class ExcelActivity extends AppCompatActivity {/*** Excel上方的表格*/private LinearLayout llTitleContainer;private NoscrollListView mLeft;private LeftAdapter mLeftAdapter;private NoscrollListView mData;private DataAdapter mDataAdapter;private SyncHorizontalScrollView mHeaderHorizontal;private SyncHorizontalScrollView mDataHorizontal;/*** excel的列表的数据*/private List<String> mLeftListData;/*** 最上面的标题的集合*/private List<String> titles;/*** 标题下方的内容的集合*/private List<String> contents;private List<View> contentViews;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.selfview_excel);initView();}private void initView() {mLeft = (NoscrollListView) findViewById(R.id.lv_left);mData = (NoscrollListView) findViewById(R.id.lv_data);mDataHorizontal = (SyncHorizontalScrollView) findViewById(R.id.data_horizontal);mHeaderHorizontal = (SyncHorizontalScrollView) findViewById(R.id.header_horizontal);mDataHorizontal.setScrollView(mHeaderHorizontal);mHeaderHorizontal.setScrollView(mDataHorizontal);llTitleContainer = findViewById(R.id.ll_excel_title_container);ThreadPoolProxyFactory.getNormalThreadPoolProxy().submit(new Runnable() {@Overridepublic void run() {//设置标题,与下方的contents的长度要一致titles = new ArrayList<>();for (int i = 0; i < 6; i++) {titles.add("标题" + i);}contents = new ArrayList<>();for (int i = 0; i < 6; i++) {contents.add("内容 " + i);}mLeftListData = new ArrayList<>();contentViews = new ArrayList<>();LinearLayout linearLayout = null;//竖直方向的行数for (int i = 0; i <30; i++) {mLeftListData.add("" + i);View view = null;linearLayout = new LinearLayout(ExcelActivity.this);for (String content : contents) {view = View.inflate(ExcelActivity.this, R.layout.item_excel_title, null);TextView tvTitle = view.findViewById(R.id.tv_item_excel_title);tvTitle.setText(content);linearLayout.addView(view);}contentViews.add(linearLayout);}//设置上方水平栏MyApplication.getMainThreadHandler().post(new Runnable() {@Overridepublic void run() {View view = null;for (String title : titles) {view = View.inflate(ExcelActivity.this, R.layout.item_excel_title, null);TextView tvTitle = view.findViewById(R.id.tv_item_excel_title);tvTitle.setText(title);llTitleContainer.addView(view);}//设置左边栏mLeftAdapter = new LeftAdapter();mLeft.setAdapter(mLeftAdapter);//设置内容mDataAdapter = new DataAdapter();mData.setAdapter(mDataAdapter);}});}});}class LeftAdapter extends BaseAdapter {@Overridepublic int getCount() {return mLeftListData.size();}@Overridepublic Object getItem(int position) {return mLeftListData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = LayoutInflater.from(ExcelActivity.this).inflate(R.layout.item_left, null);holder.tvLeft = (TextView) convertView.findViewById(R.id.tv_left);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.tvLeft.setText("第" + position + "行");return convertView;}class ViewHolder {TextView tvLeft;}}/*** 内容的适配器adapter*/class DataAdapter extends BaseAdapter {@Overridepublic int getCount() {return mLeftListData.size();}@Overridepublic Object getItem(int position) {return mLeftListData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//            convertView = LayoutInflater.from(ExcelActivity.this).inflate(R.layout.item_data, null);
//            LinearLayout llContent = (LinearLayout) convertView.findViewById(R.id.ll_excel_content);
//
//            View view = null;
//            for (String content : contents) {
//                view = View.inflate(ExcelActivity.this, R.layout.item_excel_title, null);
//                TextView tvTitle = view.findViewById(R.id.tv_item_excel_title);
//                tvTitle.setText(content);
//                llContent.addView(view);
//            }convertView = contentViews.get(position);return convertView;}}
}

3、自定义控件

public class SyncHorizontalScrollView extends HorizontalScrollView {private View mView;public SyncHorizontalScrollView(Context context) {super(context);}public SyncHorizontalScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public SyncHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);//这是上方的水平标题与下方的水平内容进行绑定if (mView != null) {mView.scrollTo(l, t);}}public void setScrollView(View view) {mView = view;}}
public class NoscrollListView extends ListView {public NoscrollListView(Context context) {super(context);}public NoscrollListView(Context context, AttributeSet attrs) {super(context, attrs);}public NoscrollListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}}

似乎就这就大功告成。

个人感觉精化点:

1、实现红、绿部分水平滑动时候的联动。主要通过俩个自定义控件SyncHorizontalScrollView的互相的绑定。在该自定义控件的onScrollChanged(...)方法中的 mView.scrollTo(l, t); ,如下:

@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);//这是上方的水平标题与下方的水平内容进行绑定if (mView != null) {mView.scrollTo(l, t);}}

2、mView是通过自定义控件中的如下方法传入,在activity中调用:

public void setScrollView(View view) {mView = view;}

3、这个点不难,但是在下当初没想到。参考了别人的项目实现、想明白。虽然逻辑简单,但是自己想不到,真尴尬!!!

结束语

忘了哪位的博客了,挺多的,可根据自己需要查看!!!

一、Android实现Excel表格,且表格能左右、上下滑动

http://www.cnblogs.com/begin1949/p/5910785.html

二、Android复杂表格的实现:https://www.jianshu.com/p/6d133f572ed2

源代码地址:https://github.com/Kelin-Hong/ScrollablePanel

三、Android实现了复杂表格,表格内容区域可以与上下滑动、左右滚动,并且标题会跟着滚动

http://blog.csdn.net/jingleye/article/details/55510135

源代码地址:https://github.com/leafseelight/ComplexTable-Master

四、Android实现类似Excel的大表格,可横向纵向滑动,带表头

http://blog.csdn.net/z3896823/article/details/72858678

源代码地址: https://github.com/z3896823/PanelList

一三四用的实现方式是类似的。都是用的ScrollView里面嵌套listview,还有就是表头都是写死的布局。

五、 Android-自定义类似excel表格,双向滑动的ListView

http://blog.csdn.net/u011511921/article/details/77865908

这篇文章的留言中看到另外一个例子:

源代码地址:https://github.com/huangyanbin/smartTable

smartTable这个Demo功能很强大,但是想要完全读取作者的代码并且能灵活运用起来有一些难度。

六、仿房产销冠APP销控表界面-多RecyclerView同步滚动

https://www.jianshu.com/p/ed7fce51e5b5

源代码地址:https://github.com/GitLqr/TopsalesSellControlTableDemo

体验不是很好。

七、Android用RecyclerView实现的二维Excel效果组件

http://www.codesocang.com/kj-recyclerviews/34949.html

没有了,欢迎指教,一起进步!!!


http://chatgpt.dhexx.cn/article/XoGa4783.shtml

相关文章

Apache POI 操作Excel表格使用详解 最全

1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。 (2)POI结构说明 包名称 说明 HSSF 提供…

022_Table表格

1. Table表格例子 1.1. Table表格用于展示多条结构类似的数据, 可对数据进行排序、筛选、对比或其他自定义操作。 1.2. Table Attributes 参数 说明 类型 可选值 默认值 data 显示的数据 array 无 无 height Table的高度, 默认为自动高度。如果height为number类型…

java 导入导出excel表格

java 导入导出excel表格 业务上有需求上传excel表格并读取内容&#xff0c;本文记录一下该方法 表格导入 引入相应的工具包 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.4.0&l…

python逻辑回归

出现函数重名问题 异常抛出 异常抛出 #逻辑回归测试 import pandas as pd from sklearn.linear_model import LogisticRegression as LR filename C:/Users/29463/OneDrive/桌面/bankloan.xls data pd.read_excel(filename) #print(data) x data.iloc[:,:8].values y data…

实现带标题的ListView

在一些项目中&#xff0c;往往有要求为ListView里的内容分类&#xff0c;比如按日期分类&#xff0c;就要把相同日期的项目放在一起。可以看一些示例图&#xff0c;会清楚一些&#xff1a; 以上根据标题来进行分类&#xff0c;实现代码如下&#xff1a; 首先是数据项的模型…

java操作excel表格详解

在日常工作中&#xff0c;对Excel工作表格的操作处理可是多的数不清楚&#xff0c;下面是java语言对其的操作&#xff0c;有需要的小伙伴可以参考下 使用场景 1、将用户信息导出为excel表格&#xff08;导出数据…) 2、将Excel表中的信息录入到网站数据库(习题上传…&#xf…

安卓表格框架-ExcelView

转载请标明来源&#xff1a;安卓表格框架-ExcelView_分享记录-CSDN博客 Github地址&#xff0c;欢迎star&#xff1a;https://github.com/September26/ExcelView 一.项目介绍 项目是仿照WPS中Excel的功能实现的&#xff0c;实现了显示&#xff0c;滑动&#xff0c;编辑等基本…

html表格打印填充分页,window.print()页面打印之表格内容分页填充进行分页打印

windwow.print()用于打印当前窗口的内容,很简便,可当内容特殊并且打印有特殊需求的时候就要绕个圈了。下面是需要打印的表格: 当数据量少的时候像上面的表格一样,中间的内容只有5条数据,打印出来在纸上会有空白,不太好。中间内容是不确定的可能几十条,可能上百条,这样循…

在线表格

在线表格案例 模仿的是腾讯文档 首先观察腾讯文档的表格效果&#xff0c;然后在构建出思路&#xff0c;开始编写代码 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>在线表格<…

Java获取word表格中的数据

前言: 有时系统中需要提取各种文件中的数据&#xff0c;比如做报表的系统中就常常与Excel表格数据做交互。做Excel报表数据时有选择POI实现的&#xff0c;但是POI功能也很单一&#xff0c;对于文档格式维护性差&#xff0c;最重要的是POI在操作word数据时显得力不从心&#xf…

HTML 表格元素

表格元素 在日常生活中&#xff0c;我们对表格已经非常熟悉了&#xff0c;表格的基本作用是用来存放数据&#xff0c;它是数据的二维容器&#xff0c;人们常常用它来记录财务数据、列车时刻表、电视节目单等。 大多数情况下&#xff0c;表格都是由列标题或行标题&#xff0c;…

Bootstrap3 表格样式

表格 HTML表格是数据的二维容器&#xff0c;它的基本作用是用来存放数据。表格能够清晰、直观地描述数据间的逻辑关系&#xff0c;如果借助CSS设计表格的样式&#xff0c;阅读数据将会变得更轻松。 表格结构包括众多标签&#xff0c;这些标签各司其职&#xff0c;共同完成二维…

数据库表格查询

1、数据库表示存储数据中所有数据的对象&#xff0c;在表中&#xff0c;数据按行和烈格式逻辑组织&#xff0c;类似于电子表格&#xff0c;数据库是SchoolMangeSystem&#xff0c;使用数据库表是SYS_Student&#xff0c;如下图&#xff1a; select字段列表&#xff0c;字段别名…

html中标题距离顶部距离,版式设计中标题间距的使用法则

主标题与副标题定义 主标题是文案的核心主旨&#xff0c;可以直接表达&#xff0c;也可以含蓄表达&#xff0c; 副标题是对对主标题意思的具体阐释&#xff0c;或者主标题意思的进一步延伸。 字距与行距 横向的字间距与纵向的行间距的关系&#xff1a; 请保持行间距的高度&…

表格解析 概览

表格解析发展至今&#xff0c;仍然是一项很年轻的研究领域&#xff0c;出现了大量解决方案&#xff0c;常用的技术包括&#xff1a;线检测、box检测、分割、多模态融合、GCN、img2seq。以下按我的理解梳理一下表格解析各个流派&#xff0c;从中了解这项任务背后所采用的技术。在…

5.让表格的标题在滚动表格时一动不动

一、冻结首行首列 处理数据量较大的表格时&#xff0c;向下拖动滚动条&#xff0c;表格的标题栏就不见了&#xff0c;用户在查看数据时&#xff0c;需要来回拖动滚动条才能看到标题&#xff0c;那么是否可以将表格设置成无论怎样滚动表格&#xff0c;标题都始终显示呢&#xf…

python表格控件_python表格控件

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pyqt5表格控件qtableview简介在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到qtableview类了,在qtableview中可…

element-ui(vue)表格的自定义标题,逻辑判断

<el-table :data"tableData" style"width: 100%" border><el-table-column width"180"><!-- 自定义标题--><template slot"header"><i class"el-icon-time"></i><span>自定义标题…

tomcat-命令窗口乱码

问题描述&#xff1a;刚下载的tomgcat不添加任何项目直接运行时&#xff0c;tomcat的命令窗口出现中文乱码 解决方法&#xff1a; 1、找到${CATALINA_HOME}/conf/logging.properties 2、添加语句&#xff1a;java.util.logging.ConsoleHandler.encoding GBK 3、重启tomcat&…

在此处打开命令窗口 (Open command window here)

在此处打开命令窗口 (Open command window here) 1. 在此处打开命令窗口 (Open command window here) Shift 鼠标右键 2. .exe 执行 在 .exe 文件所在的文件夹打开命令提示符窗口。如果使用的是 Windows Vista 或 Windows 7 系统&#xff0c;则需要在 Windows Explorer 中右…